記憶力が無い

プログラミングとランニングとカメラと何か

BigQueryテーブルのHOURパーティショニングを使ってみる

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 を使うことでパーティションの一覧を表示できます。

f:id:ttk1:20201026020545p:plain

HOUR まで含んだ partition_id が表示されました!

場合によってはうまくいかないこともある

今回使ったデータではうまくいきましたが、私が職場で試したときには Cannot output HOUR partitioned data in LegacySQL というエラーが発生してテーブルにデータが取り込めませんでした。

今回と異なる条件としては

  • 元のデータサイズが 数十GiB 程度
  • 元のファイルフォーマットが Parquet

この2点が挙げられます。

この記事では HOUR のパーティショニング使い物にならねーじゃん!!と書きたかったのですが、今回の条件ではうまくいってしまいました。 それでも私が遭遇したエラーのように、条件によってはうまくいかない場合があることは書き残しておきます。

Cannot output HOUR partitioned data in LegacySQL はこうやれば回避できるよ!という情報がもしあれば教えていただきたいです...

Copyright © 2017 ttk1