タダです.
業務で JSON データが入っているテーブルを特定条件で抽出して,集計目的で別テーブルにしたいと思ったときにハマったことがあったので対応を記事にします.
今回のハマったことの概要
今回は下記のようにクエリを投げてjsondata
という文字列になった JSON 構造データから特定のキーで情報を抽出したいと思ったのですが, 別テーブルして集計用バケットに吐き出そうとしたところ NOT_SUPPORTED: Unsupported Hive type: json
とエラーが出ました.
実行したクエリ
CREATE TABLE XXXX WITH ( format='Parquet', external_location='s3://XXXX/jsondata/' ) AS SELECT date , json_extract(json_parse(jsondata),'$.hoge') , json_extract(json_parse(jsondata),'$.fuga') , json_extract(json_parse(jsondata),'$.hogo') , json_extract(json_parse(jsondata),'$.fugo') FROM "XXXX"."XXXX" ORDER BY date DESC
対応内容
別テーブルとして出したかったのですが,クエリの結果を手にいられれば良いので,別のアプローチを探しました.クエリした結果は Athena の実行ログが保管されている S3 バケットに CSV 形式で出力されています.CSV ファイルはクエリの ID で探せたこともあり,自動化したいのでAWS CLI でシェルスクリプトにし,CSV ファイルを集計用の別バケットに移動させるようにしました.
シェルスクリプト化した部分抜粋
# クエリ ID を取得 export ATHENA_QUERY_ID=`aws athena start-query-execution --query-string "SELECT date , json_extract(json_parse(jsondata),'$.hoge') , json_extract(json_parse(jsondata),'$.fuga') , json_extract(json_parse(jsondata),'$.hogo') , json_extract(json_parse(jsondata),'$.fugo') FROM "XXXX"."XXXX" ORDER BY date DESC" --result-configuration OutputLocation=s3:/XXXX/ --output text` # クエリ ID で CSV ファイルを見つけて,集計用バケットに移動 aws s3 cp s3://XXXX/$ATHENA_QUERY_ID.csv s3://XXXX/jsondata/
上記の対応をすることで集計用バケットに CSV ファイルが移動してデータ解析ができるようになりました.
まとめ
Athena で JSON データが入っているテーブルを特定条件で抽出した時にハマった内容と対応内容を整理しました.JSON データを別テーブルにしたことがなかったのでハマったのですが,動作仕様もしれて良かったです.この記事が同じ事象に当たった方の参考情報になれば嬉しいです.