📄

BigQueryのテーブルをカラムの説明を消すことなくAirflowで更新する

2022/12/16に公開

はじめに

皆さん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