今日は Athena でのクエリ結果の出力方法についてです。
ユースケースがハマるなら CTAS で、データサイズが小さいなら Python 側で処理して、そうでなければ現状は Athena を使うのは難しそうです。データの加工に Glue Job を使えば、SparkSQL を発行して Parquet ファイルを S3 に出力できるので、私の場合は Glue Job が適切そうです。
Athena 側で処理:CTAS
Athena で CREATE TABLE AS
という、クエリ結果を元にテーブル作成する機能が2018年10月頃に追加されました。
これを実行すると、Glue データカタログにテーブルが追加され、S3 にファイルが書き込まれます。WITH 句を使うことで出力フォーマットもテキストから Parquet へ変更できるなど使い勝手が良いです。ただ、今回はパーティションを日毎に追加していきたかったのですが、CTAS だとすでに同名のテーブルが存在している場合はエラーになってしまいました。
Python 側で処理:Dativa 社の dativatools
Dativa という会社が、Athena のクライアントを拡張して、まさに上に記載したことを実現しているライブラリを提供していました。pip でインストールできます。ただ Python のライブラリで実現
Athena を ETL で使うのは諦める
Athena を使う用途って大規模データに対して集計したいという場合が多いと思うのですが、それに対して形式を指定して出力する術が非常に限られているのが現状のようです。ETL 用途で利用する場合は柔軟性が高い Glue Job を使うのが私が調べた限りは良さそうです。EMR クラスタを自前で立てて・・・というのも選択肢かもしれません。