BigQueryのパーティションテーブルの更新とクエリー
前提
パーティション設定にしたら自動で行われる、一日単位でのパーティションを選ぶ
スキーマは定義済み、テーブルは作成済み
調べること
ある一日分だけを更新することができるか?
WRITE_TRUNCATEした時に、他の日は削除されないか?
SELECTの際に対象とする日を指定することでスキャン量=料金を減らせるか?
一般に
パーティション デコレータを使用すると、クエリ結果を特定のパーティションに書き込むことができます。たとえば、2016 年 5 月 1 日のパーティションに結果を書き込むには、次のパーティション デコレータを使用します。
table_name$20160501
更新について
実験した
bq load --replaceで、テーブルにtable_name$20160501と日付部分を付けた場合、その日付の分だけが更新された
逆に日付部分を外したら、テーブル全体が更新された(他の日の分は消えた)
要注意だがちゃんと日付を指定しながら更新すれば大丈夫
スキャン量について
取り込み時間パーティション分割テーブルのデータに対してクエリを実行する場合、_PARTITIONTIME 疑似列または _PARTITIONDATE 疑似列の値を指定して、特定のパーティションを参照します。次に例を示します。
(略)
_PARTITIONDATE >= "2018-01-29" AND _PARTITIONDATE < "2018-01-30"
_PARTITIONDATE BETWEEN '2016-01-01' AND '2016-01-02'
できることになってるが「Unrecognized name: _PARTITIONDATE」って怒られる
Specifically, it exists for tables that are partitioned by ingestion time. If you partition by an existing column in the data then _PARTITIONTIME will not be available to query – AlexG
取り込み時間パーティション分割テーブルの時に使えるって話か。よく読め。
パーティションに使っている日時カラムを、WHERE句の条件にしたら、ちゃんと処理データ量が変化するのを確認した。