継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

【Athena の躓きシリーズ】Athena で JSON データを出力したい時にハマったこと

タダです.

業務で 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 ファイルが移動してデータ解析ができるようになりました.

f:id:sadayoshi_tada:20201007231208p:plain

まとめ

Athena で JSON データが入っているテーブルを特定条件で抽出した時にハマった内容と対応内容を整理しました.JSON データを別テーブルにしたことがなかったのでハマったのですが,動作仕様もしれて良かったです.この記事が同じ事象に当たった方の参考情報になれば嬉しいです.

関連記事

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com