created: 2018-10-27T17:24:40.000Z

BigQueryの日付分割テーブルを使う

bigqueryで探索するディスク領域を節約する方法は過去たくさんあった

  • _YYYYMMDD suffix pattern
  • using the _PARTITIONTIME pseudo-column
    • これはまだ今でも現役なところが多そう

TIMESTAMPかDATEのカラムをパーティションとして切れる機能が2月に発表された

パーティションにしたカラムをwhere句に入れると、それで探索範囲を節約してくれる
もちろん、bigqueryの料金も安くなる

注意点としては以下二つ

  • まだベータ版
  • レガシーSQLの文法は使えなくなる

使い方

テーブルを作る時に --time_partitioning_field オプションを指定するだけでよい

select-insertで作ったテーブルをそうする例

$ bq query \
    --destination_table grey-sort-challenge:partitioning_magic.nyc_taxi_trips_partitioned \
    --time_partitioning_type=DAY \
    --time_partitioning_field=pickup_datetime \
    --use_legacy_sql=false \
    'select * from `grey-sort-challenge.partitioning_magic.nyc_taxi_trips`'

jsonファイルから bq mk コマンドで作る例

$ bq mk --table \
     --time_partitioning_field=created \
     --use_legacy_sql=false \
     mylog.test \
     ./bigquery/test.json
Table 'pjt-192612:mylog.test' successfully created.

bq show

bq show すると timePartitioning という属性が生えている
以下の例はcreatedというカラムを日付分割パーティションカラムにして作ったテーブルの例

$ bq show --format=prettyjson mylog.work_status | jq .timePartitioning
{
  "field": "created",
  "type": "DAY"
}

今の所は日毎のパーティションしか切れないようだ ("type": "DAY")

ちゃんと減ってるか確認

--dry_run オプションをつけて statistics.totalBytesProcessed を確認

$ bq query \
     --format=prettyjson \
     --use_legacy_sql=false \
     --dry_run \
     "select distinct(created) from mylog.test where created > '2018-09-22' order by created desc" \
     | jq .statistics.totalBytesProcessed
"42065576"
$ bq query \
     --format=prettyjson \
     --use_legacy_sql=false \
     --dry_run \
     "select distinct(created) from mylog.test where created > '2018-08-22' order by created desc" \
     | jq .statistics.totalBytesProcessed
"69017048"

ちゃんとwhere句の日付指定を変更するだけで探索バイト数が減っている(安くなっている)