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)

ハッシュ関数を利用することで、
文字列をハッシュパーティションのように利用することができます。