はじめに
AWS Glueのジョブは自動的に変換スクリプトを作ってくれますが、Athenaのパーティションに対応していません。
ネットを色々見ましたが、全然上手くいかず困りましたがなんとかなったので、対応方法についてまとめました。
事前準備
事前にテーブルを作成します。
テーブルについてへGlueのGUI上からぽちぽちっと作成しています。
今回は同じテーブルでpartitionがないテーブルからparitionがあるテーブルに移行するとして記事を書いています。
b_tableはjsonで作成しています。
a_tableはなんでも良いです。(自分はCSVファイルをクローラーで読み込ませて作りました)
b_tableをjsonにした理由としては、CSVだとヘッダー行も生成されるせいかAthena上からクエリ発行できなかったからです。
Parquetで作りたかったのですが、上手くパーティションを認識してくれなかったので諦めました。
databaseは適当な場所でOKです。
a_table
id: bigint
name: string
date: string
b_table
id: bigint
name: string
date: string(partition)
ジョブの作成も必要ですが、ぽちぽちするだけなので割愛します。
スクリプトは自動生成しているものとします。
スクリプトの編集
2箇所変更が必要です。
変更後のソースのみ記述しますが、自動生成したコードを検索するとすぐに分かるかと思います。
一つ目はSelectFields.apply
を変更します。
自動生成では、パーティションについての記述がありませんが、paths
に記述を追加してあげる必要があります。
今回はdate
を追加しています。
selectfields2 = SelectFields.apply(frame = applymapping1, paths = ["id", "name", "date"], transformation_ctx = "selectfields2")
次にglueContext.write_dynamic_frame.from_catalog
を編集します。
これにはadditional_options
を設定することができるので、ここにパーティション情報を設定していきます。
partitionKeys
はList
になっているため、複数設定することが可能となっています。
複数設定する場合はテーブルに設定したパーティションの順番と合わせて記載してください。
additionalOptions = { "enableUpdateCatalog": True "partitionKeys" : ["date"]}
datasink5 = glueContext.write_dynamic_frame.from_catalog(frame = resolvechoice4, database = "default", table_name = "b_table", additional_options = additionalOptions, transformation_ctx = "datasink5")
実行と確認
実行はGUI上から可能なので、しばらく待ちます。
終わったらGlueのテーブルからパーティションが出来ていることを確認したり、Athena上からクエリ投げたりして確認してみてください。
参考URL