Skip to content

BigQueryにおけるデータバリデーション手法

BigQueryでは標準的なCHECK制約サポートされていない

制約の強制力

BigQueryでは主キー(Primary Key)や外部キー(Foreign Key)を定義できるが、これらは「強制されない(Not Enforced)」状態。データの整合性を守るためではなく、クエリの最適化(Joinの省略など)のために使われる。

唯一データベースレベルで強制できるのは、カラムのモードをREQUIREDに設定することによるNOT NULL制約のみ。

CREATE TABLE mydataset.products (
    product_id INT64 NOT NULL, -- REQUIRED モードになり、NULL を防ぐ
    price FLOAT64
);

代替となるデータバリデーション手法

1. ERROR関数による手動チェック

SQLクエリ内で特定の条件(例:価格がマイナス)を満たした場合に、意図的にエラーを発生させて処理を止める方法。このクエリをスケジュール設定しておけば、異常検知時に通知を飛ばすことも可能。

SELECT
    IF(price < 0, ERROR("価格は0以上である必要があります"), price) AS price
FROM `your_project.dataset.table`

2. dbtによるテスト(Singular Test)

dbtを使用している場合、tests/ディレクトリにSQLファイルを作成する。このクエリが1行でも結果を返すと「失敗」と判定される。

-- tests/assert_no_negative_price.sql
SELECT
    order_id,
    price
FROM {{ ref('orders') }}
WHERE price < 0

3. Data Validation Tool(DVT)の活用

Googleが提供するオープンソースのCLIツール。テーブル間の行数一致や、特定カラムの集計値が正しいかなどを自動で検証できる。

# テーブル間の行数やカラムの一致を検証するコマンド例
data-validation run \
  --type Column \
  --source-conn $SOURCE_CONN --target-conn $BQ_CONN \
  --tables-list source_db.table=bq_dataset.table

関連

引用元: NotebookLM