こんにちは。香田です。
BigQueryで提供されている日付/タイムスタンプ 分割テーブルについて、使用方法を簡単にまとめたので紹介していきます。
日付/タイムスタンプ 分割テーブルについて
日付/タイムスタンプ 分割テーブルでは、TIMESTAMP
型またはDATE
型を利用した列に基づいてテーブルが分割されます。
ほかのテーブルの分割方法として取り込み時間パーティション分割テーブル
、整数範囲パーティション分割テーブル
、日時ベースのテーブル名[PREFIX]_YYYYMMDD
で分割する日付別シャード化テーブル
があります。
現時点、テーブル分割方法を選択するのであれば日付/タイムスタンプ 分割テーブル
がベターではないでしょうか。
日付/タイムスタンプ 分割テーブルの作成
例として、DATE型のcreate_date
という列を使用した場合を記載します。
事前に下記のようなJSONスキーマファイルを用意します。
[
{
"mode": "NULLABLE",
"name": "customer_id",
"type": "INTEGER"
},
{
"mode": "NULLABLE",
"name": "first_name",
"type": "STRING"
},
{
"mode": "NULLABLE",
"name": "last_name",
"type": "STRING"
},
{
"mode": "NULLABLE",
"name": "email",
"type": "STRING"
},
{
"mode": "NULLABLE",
"name": "create_date",
"type": "DATE"
}
]
下記のように、bqコマンド実行時にJSONファイルをオプションで指定し作成できます。
bq mk --table \
--schema ./schema.json \
--time_partitioning_field create_date \
--require_partition_filter \
mydataset.customer
また、DDLを使用し作成することもできます。
CREATE TABLE IF NOT EXISTS
mydataset.customer ( customer_id INT64,
first_name STRING,
last_name STRING,
email STRING,
create_date DATE)
PARTITION BY
create_date
パーティション一覧を確認する
レガシー SQL を使用して、分割テーブル内のパーティションを一覧表示できます。
#legacySQL
SELECT
partition_id
FROM
[mydataset.customer$__PARTITIONS_SUMMARY__]
特定のパーティションを削除する
テーブル名に$yyyymmdd
を指定し削除可能です。
bq rm -f 'mydataset.customer$20200607'
パーティションの有効期限を設定する
テーブルの有効期限と同じくパーティションに対しても有効期限は設定可能です。有効期限はパーティションの日付に対して、設定した整数値を足した値が期限となる。
bq update --time_partitioning_expiration 86400 mydataset.customer
さいごに
事前にDATE/TIMESTAMP型の列を指定しておくことで、BigQueryのほうでパーティション分割してくれるので、非常に便利な機能ではないでしょうか。
パーティション分割する為に、別途読み込み処理等必要ないので管理も楽ですね!
最後までご覧頂きありがとうございます!