https://t.co/vJRqKxEB3l
— tama (@mscle11) 2020年9月22日
BigQueryのテーブルパーティションがhourlyで切れるようになったぽい。これは超助かる。 pic.twitter.com/ZAlgat4VNC
BigQueryのテーブルのパーティションがHOURでも切れるようになったので試してみました。
アップデート内容
これまでBigQueryのテーブルはDAY単位でしかパーティショニングが出来なかったのですが、このアップデートで HOUR, MONTH, YEAR でもパーティショニング出来るようになりました!!
HOUR 単位で作成されるログデータがこれで扱いやすくなるので、個人的にうれしいアプデです。
検証
適当なデータを作って HOUR のパーティショニングを試してみます。
※コマンドの実行環境は Cloud Shell を使っています。
テーブルの準備
bq mk --table \ --time_partitioning_field dt \ --time_partitioning_type HOUR \ test.hour_partitioning_test \ dt:DATETIME
HOUR でパーティショニングするので --time_partitioning_type HOUR
を指定します。
カラムは DATETIME 型のものを1つだけ定義します。
データの準備
echo '2020-10-26 00:00:00' > data.csv echo '2020-10-26 01:00:00' >> data.csv echo '2020-10-26 02:00:00' >> data.csv
適当に HOUR の異なるタイムスタンプが3行入ったテキストデータを作成します。
データをテーブルに取り込む
bq load \ --source_format=CSV \ test.hour_partitioning_test \ ./data.csv
作ったデータをテーブルに取り込みます。
結果の確認
#legacysql select partition_id from [test.hour_partitioning_test$__PARTITIONS_SUMMARY__]
Legacy SQL ですが、この SQL を使うことでパーティションの一覧を表示できます。
HOUR まで含んだ partition_id
が表示されました!
場合によってはうまくいかないこともある
今回使ったデータではうまくいきましたが、私が職場で試したときには Cannot output HOUR partitioned data in LegacySQL
というエラーが発生してテーブルにデータが取り込めませんでした。
今回と異なる条件としては
- 元のデータサイズが 数十GiB 程度
- 元のファイルフォーマットが Parquet
この2点が挙げられます。
この記事では HOUR のパーティショニング使い物にならねーじゃん!!と書きたかったのですが、今回の条件ではうまくいってしまいました。 それでも私が遭遇したエラーのように、条件によってはうまくいかない場合があることは書き残しておきます。
Cannot output HOUR partitioned data in LegacySQL
はこうやれば回避できるよ!という情報がもしあれば教えていただきたいです...