AWS Athena で JSON ファイルを取り扱ってみたまとめ


AWS Athena は AWS 上のリソースを Database のように扱えるサービスです。

主な用途としてはログファイルの解析とかになるかと思いますが、

S3 上に JSON ファイルをボスボス配置して 簡易 CMS 的な使い方もできたりします。

データの準備

まずは S3 のバケットを作成します。

Athena のリージョンと S3 のリージョンはあわせたほうがいいんでしょうか…?

作成したバケットの中にフォルダを作成し、中に JSON ファイルを配置します。

JSON ファイルは 1ファイルが1レコードという扱いになるので、{ から書き始める形になります。ファイル名は無視されます。

以下のような形式の JSON ファイルはNGです。

{
  "title":"hgoe",
  "url": "piyo"
}

必ず以下のような形でアップロードします。

{"title":"hoge","url": "piyo"}

以下のように意図しない空行が末尾にあるとnullレコードが出来たりします。

{"title":"hoge","url": "piyo"}


位置ファイル内に複数レコード必要な際には、以下のように記述します。

{ ... },
{ ... }

ファイル名は日本語でもOKです。

中にフォルダを作って深い階層においてもOK

データ内に日本語が入っていてもOKです。

テーブルの作成

Athena の管理コンソールのadd tableからテーブルを作成します。

テーブルの作成時のLocationにはs3://bucket/folder/の形式でフォルダを選択します。

指定されたフォルダの中のデータ全てが読み取り対象となり、異常なオブジェクトが1つでもあるとクエリを実行出来ません。

無精して手作業でオブジェクトを運用とかはちょっと無理っぽい気がします。gulp-yamlとかを使用してJSONファイルを自動生成するのをおすすめします。

クエリの発行

テーブルを作成するとクエリを発行出来ます。

列に指定したプロパティが存在しない場合 nullで扱われます。

int 型は 3 でも "3" でも正常に認識されますが、 3hogeのように文字列を混入させると、 クエリの発行自体ができなくなります。

タイムスタンプは UnixTimestamp を使用するようです。

ダッシュボードのバグなのか何なのか知らないですが、オブジェクトを追加削除した瞬間のクエリ結果は一瞬おかしくなります。

現場からは以上です。