BigQuery 日付/タイムスタンプ 分割テーブルについて

こんにちは。香田です。

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のほうでパーティション分割してくれるので、非常に便利な機能ではないでしょうか。

パーティション分割する為に、別途読み込み処理等必要ないので管理も楽ですね!

最後までご覧頂きありがとうございます!

SNSでもご購読できます。