BigQueryのHASH パーティショニングもどきを利用する
BigQueryで
主キー当たる項目にUUID(Universally Unique Identifier)を生成し
こちらの項目に対してパーティション列として使いたい用途がありました。
パーティション分割テーブルについて 公式ドキュメントを読むと
取り込み時間 | 日付 | 数値範囲 | |
---|---|---|---|
テーブルの分割方法 | データの取り込み時間や到着時間 | TIMESTAMP または DATE列 | 整数列 |
分割単位 | 自動で生成される疑似列 | 列を指定 | 列を指定 |
となり、UUID(文字列)は対応しておりません。
公式ドキュメントにあるハッシュ関数を読んだところ farm_fingerprintを見つけました
文字列を数値に変換できますので
次にハッシュパーティションのように利用できるようにするため
UDFユーザ定義関数を定義します。
-- partition_division_sizeは分割する数を指定 CREATE OR REPLACE FUNCTION dataset.generate_partion_no(uuid STRING) RETURNS INT64 AS ( ABS(MOD(FARM_FINGERPRINT(uuid), partition_division_size)) ) ;
パーティション列にデータを登録する際にUDF関数を利用します。
SELECTする際は 以下のようなSQLで取得できます。
SELECT * FROM dataset.table WHERE partition_column = dataset.generate_partion_no(@uuid)