目次
はじめに
こんにちは、omkです。
これまでGlueジョブ時でパーティションごとに出力したデータを取り込むためにGlue Crawlerを実行している環境があったのですが、毎度Crawlerを走らせるのも面倒なので(起動自体は自動化していますがCrawlerが完了するまでのあれやこれやが面倒)、ジョブでのデータの書き込み時にパーティションを更新してCrawlerを利用しないように変更しました。
以下のドキュメントを見ていただくとその方法が記載されています。
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/update-from-job.html
その際にparquet形式を利用している場合は以下の引用のように、テーブル側の設定を追加する必要があります。
更新しているテーブルの useGlueParquetWriter テーブルプロパティを true に設定する。
テーブル自体はCrawlerで作成していたのでCFnテンプレート等があるわけでもなく一つずつテーブルの設定を変更していくことになるのですが、テーブルの量が膨大だったのでプロパティを追加するだけでも一苦労……
CLIでまとめてやっちゃおー、ということでCloudShellで実行できるワンライナーを作成する運びとなりました。
前提
- CloudShellで実行(awscliとjqを利用するので入っていない環境では入れてください)
- 必要なIAM権限は割りあたっているものとする
- やること: Glue Data Catalogの特定のデータベースに属すすべてのテーブルに対して{"useGlueParquetWriter": "true"}のテーブルプロパティを追加する(必要に応じて変更してください)
- 極力不必要にテーブルの設定を変更したくない
できたもの
aws glue get-tables --database-name $DBNAME | jq -rc '.TableList[].Parameters |= .+ {"useGlueParquetWriter": "true"} | .TableList[] | del(.DatabaseName, .CreateTime, .UpdateTime, .CreatedBy, .IsRegisteredWithLakeFormation, .CatalogId, .VersionId)' | xargs -I{} -d'\n' aws glue update-table --database-name $DBNAME --table-input {}
解説
「aws glue update-table」でテーブルを更新する際に必要な「--table-input」の設定ですが、特定の値を更新するというより更新して出来たテーブルの設定丸々全体を入れるイメージになります。
であるため「aws glue get-tables」で取得したテーブルの設定に必要な設定を追加して「aws glue update-table」に渡す流れになります。
ただ、その際に「update-table」では設定できない情報も「get-tables」には含まれますので、不要な情報は先に落としておきます。
「--table-input」の構文については以下を参照。
https://docs.aws.amazon.com/cli/latest/reference/glue/update-table.html
「aws glue get-tables」で全テーブルの設定を取得します。
アウトプットの例は以下を参照。
https://docs.aws.amazon.com/cli/latest/reference/glue/get-tables.html
で取得した設定をパイプでjqに渡して、
.TableList[].Parameters |= .+ {"useGlueParquetWriter": "true"}
で各テーブルのテーブルパラメータに{"useGlueParquetWriter": "true"} を追加します。
.TableList[] | del(.DatabaseName, .CreateTime, .UpdateTime, .CreatedBy, .IsRegisteredWithLakeFormation, .CatalogId, .VersionId)
で各テーブルの設定から不要な要素をデリートします。
ここに記載していない要素に関しても「--table-input」に設定できないものがあれば落としておきます(逆に、入れたい要素だけを選択して取ることも可能ですが、テーブルの設定を極力変えたくないという要件のもと、不要な設定を除外するやり方になりました)。
jqには「-c」オプションを使用しているので「.TableList[]」の要素であるテーブルごとに1行のJSON形式で出力されます。
これでxargsの「-I」オプションで1行ずつ(1テーブルずつ)処理できます。
「aws glue update-table」の「--table-input」に1テーブルずつ設定を渡して更新してくれるので処理が終わるのを少し待てば作業完了です。
おわりに
一律の更新なのにコンパネで手動設定するか迷うレベルで手間が多かったので、いい感じに一括でできて良かったです。
アーキテクト課のomkです。
AWSについて雑多に取り組んだ内容を発信しています!!