/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

2019/02/27 Athena の結果を Parquet 形式で出力したい

今日は Athena でのクエリ結果の出力方法についてです。

ユースケースがハマるなら CTAS で、データサイズが小さいなら Python 側で処理して、そうでなければ現状は Athena を使うのは難しそうです。データの加工に Glue Job を使えば、SparkSQL を発行して Parquet ファイルを S3 に出力できるので、私の場合は Glue Job が適切そうです。

Athena 側で処理:CTAS

dev.classmethod.jp

Athena で CREATE TABLE AS という、クエリ結果を元にテーブル作成する機能が2018年10月頃に追加されました。

docs.aws.amazon.com

これを実行すると、Glue データカタログにテーブルが追加され、S3 にファイルが書き込まれます。WITH 句を使うことで出力フォーマットもテキストから Parquet へ変更できるなど使い勝手が良いです。ただ、今回はパーティションを日毎に追加していきたかったのですが、CTAS だとすでに同名のテーブルが存在している場合はエラーになってしまいました。

Python 側で処理:Dativa 社の dativatools

Dativa という会社が、Athena のクライアントを拡張して、まさに上に記載したことを実現しているライブラリを提供していました。pip でインストールできます。ただ Python のライブラリで実現

www.dativa.com

Athena を ETL で使うのは諦める

Athena を使う用途って大規模データに対して集計したいという場合が多いと思うのですが、それに対して形式を指定して出力する術が非常に限られているのが現状のようです。ETL 用途で利用する場合は柔軟性が高い Glue Job を使うのが私が調べた限りは良さそうです。EMR クラスタを自前で立てて・・・というのも選択肢かもしれません。