問題

分割テーブルの概要 | BigQuery | Google Cloud

BigQuery の取り込み時間分割テーブルが持つ _PARTITIONTIME 疑似列には,そのレコードが挿入された日付が記録される.つまり 2018-06-22 に挿入されたレコードに絞って検索したい場合は SQL にて以下のように指定すればよい.

WHERE _PARTITIONTIME BETWEEN TIMESTAMP("2018-06-22") AND TIMESTAMP("2018-06-23")

しかし,上記のように WHERE 句を指定してもデータが返ってこなかった.一方で _PARTITIONTIME を指定しなければデータが返ってきた.この結果を受けて _PARTITIONTIME に何が格納されているのか調べたところ NULL だった.

原因と解決

BigQuery へのデータのストリーミング | BigQuery | Google Cloud

データがコピーやエクスポートのオペレーションに使用可能になるまでに最大 90 分かかることがあります。また、分割テーブルにストリーミングする場合、ストリーミング バッファ内のデータは _PARTITIONTIME 疑似列が NULL 値になります。

データ挿入後の最大 90 分間は _PARTITIONTIME が NULL 値になるとのこと.確かに,挿入からある程度時間が経ったレコードについては _PARTITIONTIME にレコードが挿入された日付が格納されており, WHERE 句で使用できるようになっていた.

検索対象に直近 90 分間に挿入されたデータを含めたい場合は WHERE 句で OR _PARTITIONTIME IS NULL を指定すればよい.