BigQueryのテーブルをカラムの説明を消すことなくAirflowで更新する
はじめに
皆さんETLしてますか。Nakamoriです。
ETLでテーブルを更新する際に、Airflowのを用いてBigQueryInsertJobOperatorを用いて行うことがあります。
テーブルの洗い替えだからといって、write_dispositionをWRITE_TRUNCATE
にしてしまうとカラムの説明が消去されてしまい更新するたびに書き込まなくてはなりません。
今回はそれを回避する方法を調査したので共有します。
また、これはポリシータグやラベル、カラムのモードにも使えるので非常に有効な方法となります。
方法
結論
最初にTRANCATEするJobを挟んでからWRITE_EMPTY
を使う
説明
Airflowが利用しているBigquery APIには以下のように記載されています。
WRITE_TRUNCATE: If the table already exists, BigQuery overwrites the table data and uses the schema from the query result.
(cf. BigQuery API JobConfigurationQuery)
WRITE_TRUNCATE
はBigQueryの仕様上、クエリを実行した後のschemaを優先する設定になっているということです。それを回避するためにWRITE_EMPTY
を使いますが、WRITE_EMPTY
はデータがテーブルに残っているとエラーを吐き出してしまいます。
そのため、TRUNCATEするJobを事前に挟むことでその点を解決できます。
欠点
欠点はエラーハンドリングが難しくなる点です。
WRITE_TRUNCATE
は動作の最中にエラーが発生した場合も、元のテーブルが消えることはありません。しかし、この2段階に分けたワークフローではTRUNCATEのみが成功してしまう場合があります。
最後に
説明を書き込むためのメタデータをどこかに保存しているのであれば、BigQueryUpdateTableSchemaOperatorをDAGの最後に置くだけで良いかもしれませんね。ポリシータグなどデータの権限が直接関わってくる場合においては重要なテクニックになるので参考にしてみてください。
引用元
今回の記事はこちらのQ&Aを元に作成しました。
https://stackoverflow.com/questions/64440753/bigqueryoperator-changes-the-table-schema-and-column-modes-when-write-dispositio
Discussion