Dataformは、BigQuery上でデータ変換のワークフローを開発するためのGoogle Cloudのサービスです。
Dataformにはアサーションという機能があり、データ品質のテストを実装することができます。
今回はこのアサーションを利用して、直近一週間の対象のカラムにNull値が含まれているかを確認するアサーションを実装してみました。
概要
Dataformのアサーションについて
Dataformには組み込みアサーションと手動アサーションがあります。
- 組み込みアサーション
- SQLXファイルのテーブルの
configブロックに追加する - Dataformでテーブルを作成した後に実行される
- 以下を検査することができる
nonNull:対象の列にNull値がないことrowConditions:対象の列がカスタムロジックの条件を満たすことuniqueKey/uniqueKeys:対象の列に重複した値がないこと
- SQLXファイルのテーブルの
- 手動アサーション
- 専用のSQLXファイルにSQLクエリを定義する
- 組み込みアサーションよりも複雑なロジックを実装できる
- クエリの実行結果が0件の場合は成功、1行以上ある場合は失敗となる
詳細についてはリンクをご参照ください。
Null値のアサーションは以下のように組み込みアサーションのnonNullでも実装可能です。
一方で、nonNullで実装した場合、作成されたテーブルへの実行となるため、スキャン量が多くなってしまうことがあります。
config {
type: "table",
assertions: {
nonNull: ["order_id", "quantity"]
}
}
SELECT ...
そのため、今回は直近1週間にアップデートされたデータにNull値が含まれているかどうかを手動アサーションで実装してみたいと思います。
実際にやってみる
以下のようなテーブルがあるとします。
| order_date | order_id | quantity | updated_at |
|---|---|---|---|
| 2026-02-03 | xxxxx | 3 | 2026-02-01 13:30:00 |
| 2026-02-05 | yyyyy | 1 | 2026-02-03 10:00:00 |
| 2026-02-11 | zzzzz | 5 | 2026-02-10 18:00:00 |
今回は以下の通りに実装します。
- 直近一週間でアップデートされたデータをアサーション対象とすること
order_idとquantityにNull値が含まれていないこと
実装したコード
2つのパターンで記述しています。
どちらもNull値が含まれていないことをチェックできます。
例1
該当するorder_id, quantity, order_dateを出力し、エラー原因の特定がしやすいクエリ
SELECT
*
FROM
`my_table`
WHERE
updated_at >= DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 7 DAY)
AND (order_id IS NULL OR quantity IS NULL)
例2
件数だけのシンプルな結果を確認できるクエリ
以下のようにカスタムエラーメッセージを追加することも可能
SELECT
COUNT(1) AS error_count,
'直近1週間のデータのorder_id, quantityにNULL値が含まれています。件数=' || CAST(COUNT(1) AS STRING) AS error_message
FROM
`my_table`
WHERE
updated_at >= DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 7 DAY)
AND (order_id IS NULL OR quantity IS NULL)
HAVING error_count > 0
まとめ
今回は、手動アサーションで直近1週間のデータにNull値が含まれているかどうかの検査をするアサーションを実装しました。
アサーションは、データの信頼性を担保し、分析や業務判断を支える重要な役割を果たします。
データの不備や異常値を早期に発見し対応することで、品質の高いデータを活用したビジネス上の判断ができるかと思います。
最後まで読んでいただきありがとうございました。
