【GCP Dataform】アサーションを定義してデータのテストを行う

BigQuery

こんにちは、KIYONOのエンジニアです。

Dataformを使いこなすための便利な機能を複数回に分けて紹介していきます。

本記事は、Dataformのテストクエリ機能であるアサーションを解説いたします。

アサーションとは

アサーションは、”アサーションは、クエリで指定された 1 つ以上のルールに違反する行を検索するデータ品質テストクエリ”を指します(公式ドキュメント「アサーションを使用したテーブルのテスト」より)。

SQLXファイルで検証したい条件を定義することで、Dataformがそれを検証するためのSQLを作成し、定義したタイミングで実行されます。

アサーション合否は、その実行結果が行を返すかどうかで判定を行います。

  • アサーションクエリが行を返す場合:テーブルに違反したデータが混入している
  • アサーションクエリが行を返さない場合:テーブルに正常にデータが格納されている

検証用クエリであるため、このクエリの実行自体がテーブルのデータに影響を与えることはありません。

※アサーションの結果をトリガーとしてSQLXファイルの実行を制御している場合は影響を受けることが考えられます。

アサーションの実装

SQLXファイルに定義する

アサーションはSQLXファイルのconfigブロックに定義したりアサーション用のファイルを作成したりすることで実装ができます。

アサーションの種類

Dataformで用意されいてるconfigブロックに設定可能なアサーションは、全部で4種類です。

※公式ドキュメント「アサーションを使用したテーブルのテスト」より

nonNull

指定したカラムにnullが含まれているかどうかをテストします。

nonNull: {[ “カラム名” ]}

指定したカラム(列)のうち、nullの値になっている行を抽出するクエリを作成します。

ユニークキーなど、nullになってはいけないデータをテストするために定義します。

config {
 type: "table",
 assertions: {
  nonNull: ["user_id", "customer_id", "email"]
 }
}
SELECT ...

uniqueKey

指定したカラムがユニークな値になっているか(重複した値が含まれていないかどうか)をテストします。

uniqueKey: [“カラム名“]

指定したカラム(列)で値が重複している行を抽出するクエリを作成します。

ユニークキーなど、一意の値で扱われるべきカラムをテストするために定義します。

※nonNull同様に複数カラム定義できます。

※uniqueKeysとの違いに注意!

config {
 type: "view",
 assertions: {
  uniqueKey: ["user_id"]
 }
}
SELECT ...

uniqueKeys

指定したカラムの組み合わせがユニークになっているか(重複していないか)をテストします。

uniqueKeys: [[“カラム名1“], [“カラム名2“, “カラム名3“]]

uniqueKeys: [ ] に指定したカラムの組み合わせが重複している行を抽出するクエリを作成します。

上記の場合は、①カラム1の値が重複している行②カラム2とカラム3の組み合わせが重複している行を抽出するクエリを作成します。

単体ではなく、組み合わせによって一意の値で扱われるべきカラムをテストするために定義します。

※nonNull同様に複数カラムの組み合わせを定義できます。

※uniqueKeyとの違いに注意!

config {
 type: "table",
 assertions: {
  uniqueKeys: [["user_id"], ["signup_date", "customer_id"]]
 }
}
SELECT ...

◆rowConditions

上記3つ以外の条件をカスタムで設定し、テストします。

rowConditions: [ ‘条件1‘, ‘条件2‘]

カスタムで設定した条件に合致する行を抽出するクエリを作成します。

上記のアサーションではテストできない条件をテストするために定義します。

※nonNull同様に複数カラム定義できます。

config {
 type: "incremental",
 assertions: {
  rowConditions: [
   'signup_date is null or signup_date > "2022-08-01"',
   'email like "%@%.%"'
  ]
 }
}
SELECT ...

アサーション使用例

アサーションの基本的な実装方法を例を用いて解説いたします。

検証条件

”sample”テーブル(sample.sqlx)に格納されているデータは

  • ”column1”カラムはユニークキーである
  • ”column2”カラムはnullにできない

という2つの条件を満たしているかどうか、を検証するとします。

上記を検証するために

  • ”column1”カラムで重複が発生している行を抽出するクエリ
  • ”column2”カラムでnullになっている行を抽出クエリ

を実行し、行が返ってくるかどうかを確認します。

行が返ってくれば、条件を満たしていない、ということになりアサーションは失敗となります。

では、この2つの条件をアサーションとして定義し、Dataformにクエリを作成させます。

アサーション定義

アサーションはSQLXファイルのconfigブロック内にオプションとして定義することができます。

※参照

sample.sqlxファイルに以下のように記述します。

config {
 type: "table",
 assertions: {
  uniqueKey: ["column1"],
  nonNull: ["column2"]
 }
}

SELECT
 column1,
 column2,
 column3
FROM
 ${ref("test")}

上記のSample.sqlxを書くと、Dataformがアサーションを認識して定義に基づいたテスト用クエリを2つ作成します。

▼(データセット名)_(sqlxファイル名)_assertions_rowConditions

SELECT
 'column2 IS NOT NULL' AS failing_row_condition,
 *
FROM `(データソース名).(データセット名).(sqlxファイル名)`
WHERE NOT (column2 IS NOT NULL)

▼(データセット名)_(sqlxファイル名)_assertions_uniqueKey_0

SELECT
 *
FROM (
 SELECT
  column1,
  COUNT(1) AS index_row_count
 FROM `(データソース名).(データセット名).(sqlxファイル名)`
 GROUP BY column1
) AS data
WHERE index_row_count > 1

Compiled Graphで確認をすると、それぞれのアサーションクエリが、元のクエリの後に作成されていることがわかります。

ただし、アサーションはテスト用のクエリですので、アサーションに失敗したからといってその他の”実行を停止する”、などの機能は持ち合わせていません。

ただ、”失敗した”という事実を教えてくれるだけです。

でも実際はアサーション失敗時にそれ以降の実行を中止したい場合がありますよね。

そんなときに活用できる機能を次のセクションでご紹介します。

アサーションに関する設定

前セクションで説明したように、アサーションをconfigブロックに定義しただけではテストを行うだけで、次工程の実行を制御することはできません。

たとえば以下の図のようになります。

sampleにアサーションのクエリが依存関係にありますが、テーブル1・テーブル2・テーブル3はアサーションのクエリと依存関係にありません。

 

ここでは、作成したアサーションと任意のテーブル(やビュー)のアクションを依存関係として定義し、テスト結果による制御をしてみたいと思います。

 

sqlxファイルのocnfigブロックで、アクションどうしの依存関係を定義するオプションがあります。

dependencies: [“アクション名(テーブル名、アサーション名など“, “アクション名(テーブル名、アサーション名など)“]

configのoptionで別のsqlxファイルで定義済みのアサーションを指定すると、このテーブルと指定されたアサーションの間に依存関係が定義されます。

例えば、前セクションで定義した二つのアサーションを指定してみます。

▼dependencies_sample.sqlx

config{
 type: "table",
 dependencies: [
   "(データセット名)_(sqlxファイル名)_assertions_uniqueKey_0",
   "(データセット名)_(sqlxファイル名)_assertions_rowConditions"
  ] } 
SELECT ... 
FROM ${ref("sqmple")} ...

上記のコードにより、それぞれのテーブル(やビュー)の間に依存関係が定義されました。

  • sample
  • dependencies_sample
  • (データセット名)_(sqlxファイル名)_assertions_uniqueKey_0
  • (データセット名)_(sqlxファイル名)_assertions_rowConditions

それぞれの依存関係はこのようになります。

依存関係が定義されたことで、sampleと二つのアサーションクエリの実行が成功した場合に次のdependencies_sampleの実行が開始されます。

アサーションの実装:アサーション専用のファイルを作成する

ここまでの説明では、アサーションをconfigブロックに定義することでdataformがクエリを作成してくれました。

このテストクエリは、sqlxファイルとして自作することができます。

たとえばassertion_file.sqlxを以下のように作成するとします。

config {
type: "assertion"
}

SELECT *
FROM (テストしたいテーブル)
WHERE (テスト条件)

この自作クエリは、データが正常であれば実行結果が0行になるようにします。

ここで作成したアサーションは、上記で説明した内容にも適用できます。

おわりに

本記事ではDataformのアサーション機能の実装について解説しました。

実装されたアサーションは、BQ上にデータセットが作成され、そこにビューとして保存されます。

アサーションの実行結果はそちらから確認することができます。

テーブルやビューが正常に作成されているかをチェックする便利な機能です。

ぜひご活用ください。

〔参考ドキュメント〕

コメント

タイトルとURLをコピーしました