自動データ品質を使用する

このページでは、Dataplex Universal Catalog のデータ品質スキャンを作成する方法について説明します。

データ品質スキャンの詳細については、自動データ品質についてをご覧ください。

始める前に

  1. Enable the Dataplex API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  2. 省略可: データ プロファイル スキャンの結果に基づいてデータ品質ルールの推奨事項を Dataplex Universal Catalog で生成する場合は、データ プロファイル スキャンを作成して実行します。

必要なロール

  • BigQuery テーブルでデータ品質スキャンを実行するには、BigQuery テーブルの読み取り権限と、テーブルのスキャンに使用するプロジェクトで BigQuery ジョブを作成するための権限が必要です。

  • BigQuery テーブルとデータ品質スキャンが異なるプロジェクトにある場合、データ品質スキャンを含むプロジェクトの Dataplex Universal Catalog サービス アカウントに、対応する BigQuery テーブルに対する読み取り権限を付与する必要があります。

  • データ品質ルールが追加のテーブルを参照している場合、スキャン プロジェクトのサービス アカウントには、同じテーブルに対する読み取り権限が必要です。

  • スキャン結果を BigQuery テーブルにエクスポートするために必要な権限を取得するには、結果のデータセットとテーブルに対する BigQuery データ編集者(roles/bigquery.dataEditor)IAM ロールを Dataplex Universal Catalog サービス アカウントに付与するよう管理者に依頼してください。これにより次の権限が付与されます。

    • bigquery.datasets.get
    • bigquery.tables.create
    • bigquery.tables.get
    • bigquery.tables.getData
    • bigquery.tables.update
    • bigquery.tables.updateData
  • BigQuery データが Dataplex Universal Catalog レイクに編成されている場合は、Dataplex Universal Catalog サービス アカウントに Dataplex メタデータ リーダー(roles/dataplex.metadataReader)と Dataplex 閲覧者(roles/dataplex.viewer)の IAM ロールを付与します。または、次のすべての権限が必要です。

    • dataplex.lakes.list
    • dataplex.lakes.get
    • dataplex.zones.list
    • dataplex.zones.get
    • dataplex.entities.list
    • dataplex.entities.get
    • dataplex.operations.get
  • Cloud Storage から BigQuery の外部テーブルをスキャンする場合は、Dataplex Universal Catalog サービス アカウントにバケットに対する Storage オブジェクト閲覧者(roles/storage.objectViewer)ロールを付与します。または、Dataplex Universal Catalog サービス アカウントに次の権限を割り当てます。

    • storage.buckets.get
    • storage.objects.get
  • データ品質スキャンの結果を Dataplex Universal Catalog メタデータとして公開するには、テーブルに対する BigQuery データ編集者(roles/bigquery.dataEditor)IAM ロールと、テーブルと同じロケーションにある @bigquery エントリ グループに対する dataplex.entryGroups.useDataQualityScorecardAspect 権限が付与されている必要があります。または、テーブルと同じロケーションにある @bigquery エントリ グループに対する Dataplex Catalog 編集者(roles/dataplex.catalogEditor)ロールが付与されている必要があります。

    または、次のすべての権限が必要です。

    • bigquery.tables.update - テーブルに対する権限
    • dataplex.entryGroups.useDataQualityScorecardAspect - @bigquery エントリ グループに対する権限

    または、次のすべての権限が必要です。

    • dataplex.entries.update - @bigquery エントリ グループに対する権限
    • dataplex.entryGroups.useDataQualityScorecardAspect - @bigquery エントリ グループに対する権限
  • BigQuery の列レベルのアクセス ポリシーで保護されている列にアクセスする必要がある場合は、それらの列に対する権限を Dataplex Universal Catalog サービス アカウントに割り当てます。データスキャンを作成または更新しているユーザーには、列に対する権限も必要です。

  • テーブルで BigQuery 行レベルのアクセス ポリシーが有効になっている場合、Dataplex Universal Catalog サービス アカウントに表示される行のみをスキャンできます。行レベルのポリシーに対する個々のユーザーのアクセス権限は評価されません。

必要なデータスキャンのロール

自動データ品質を使用するには、次のいずれかの IAM ロールを付与するよう管理者に依頼してください。

  • DataScan リソースに対する完全アクセス権: Dataplex DataScan 管理者(roles/dataplex.dataScanAdmin
  • DataScan リソースを作成する: プロジェクトに対する Dataplex DataScan 作成者(roles/dataplex.dataScanCreator
  • DataScan リソースに対する書き込みアクセス権: Dataplex DataScan 編集者(roles/dataplex.dataScanEditor
  • ルールと結果を除く DataScan リソースへの読み取りアクセス: Dataplex DataScan 閲覧者(roles/dataplex.dataScanViewer
  • ルールと結果を含む DataScan リソースへの読み取りアクセス権: Dataplex DataScan データ閲覧者(roles/dataplex.dataScanDataViewer

次の表に、DataScan 権限の一覧を示します。

権限名 次のことをする権限を付与します。
dataplex.datascans.create DataScan を作成する
dataplex.datascans.delete DataScan を削除する
dataplex.datascans.get ID やスケジュールなどのオペレーション メタデータを表示するが、結果やルールを表示しない
dataplex.datascans.getData ルールと結果を含む DataScan の詳細を表示する
dataplex.datascans.list DataScan を一覧表示する
dataplex.datascans.run DataScan を実行する
dataplex.datascans.update DataScan の説明を更新する
dataplex.datascans.getIamPolicy スキャンの現在の IAM 権限を表示
dataplex.datascans.setIamPolicy スキャンの IAM 権限を設定する

データ品質ルールを定義する

データ品質ルールは、組み込みルールまたはカスタム SQL チェックを使用して定義できます。Google Cloud CLI を使用している場合は、これらのルールを JSON ファイルまたは YAML ファイルで定義できます。

次のセクションの例では、さまざまなデータ品質ルールを定義する方法を示します。このルールは、顧客取引に関するデータを含むサンプル テーブルを検証しています。テーブルのスキーマは次のとおりであると想定しています。

列名 列の型 列の説明
transaction_timestamp タイムスタンプ 取引のタイムスタンプ。テーブルはこのフィールドでパーティション分割されます。
customer_id 文字列 8 文字に続いて 16 桁の数字の形式のお客様 ID。
transaction_id 文字列 取引 ID はテーブル全体で一意である必要があります。
currency_id 文字列 サポートされている通貨の一つ。通貨の種類は、ディメンション テーブル dim_currency で使用可能な通貨のいずれかと一致する必要があります。
amount 浮動小数点数 取引金額。
discount_pct 浮動小数点数 割引率。この値は 1~100 の範囲で指定してください。

組み込みルールの種類を使用してデータ品質ルールを定義する

次のルールの例は、組み込みルールの種類に基づいています。 Google Cloud コンソールまたは API を使用して、組み込みルールの種類に基づいてルールを作成できます。Dataplex Universal Catalog は、これらのルールの一部を推奨する場合があります。

列名 ルールの種類 推奨サイズ ルールのパラメータ
transaction_id 一意性チェック 一意性 しきい値: Not Applicable
amount NULL チェック 完全性 しきい値: 100%
customer_id 正規表現チェック 有効性 正規表現: ^[0-9]{8}[a-zA-Z]{16}$
しきい値: 100%
currency_id 値セットチェック 有効性 セット: USD,JPY,INR,GBP,CAN
しきい値: 100%

カスタム SQL ルールを使用してデータ品質ルールを定義する

カスタム SQL ルールを構築するには、次のフレームワークを使用します。

  • 一度に 1 行を評価するルールを作成する場合は、Dataplex Universal Catalog がクエリ SELECT COUNTIF(CUSTOM_SQL_EXPRESSION) FROM TABLE を評価する際に成功した行数を生成する式を作成します。Dataplex Universal Catalog では、成功した行数がしきい値に対してチェックされます。

  • 行全体を評価する、またはテーブル条件を使用するルールを作成する場合は、Dataplex Universal Catalog がクエリ SELECT IF(CUSTOM_SQL_EXPRESSION) FROM TABLE を評価する際に成功または失敗を返す式を作成します。

  • データセットの無効な状態を評価するルールを作成する場合は、無効な行を返すステートメントを指定します。行が返された場合、ルールは失敗します。SQL ステートメントの末尾のセミコロンを省略します。

  • ソーステーブルとそのフィルタを明示的に記述する代わりに、ルールでデータ参照パラメータ ${data()} を使用することで、データソース テーブルとそのすべての前提条件フィルタを参照できます。前提条件フィルタの例としては、行フィルタ、サンプリング パーセンテージ、増分フィルタなどがあります。${data()} パラメータでは大文字と小文字が区別されます。

次のルールの例は、カスタム SQL ルールに基づいています。

ルールの種類 ルールの説明 SQL 式
行の条件 discount_pct の値が 0~100 の間かどうかを確認します。 0 <discount_pct および discount_pct < 100
行の条件 currency_id がサポートされている通貨のいずれかであることを検証するリファレンス チェック。 currency_id in (select id from my_project_id.dim_dataset.dim_currency)
テーブルの条件 平均 discount_pct が 30% から 50% の間であることを確認する集計 SQL 式。 30<avg(discount) AND avg(discount) <50
行の条件 日付が将来でないかを確認します。 TIMESTAMP(transaction_timestamp) < CURRENT_TIMESTAMP()
テーブルの条件 平均取引金額が国ごとに事前に定義された値より小さいことを確認する BigQuery ユーザー定義関数(UDF)。次のコマンドを実行して、(JavaScript)UDF を作成します。
        CREATE OR REPLACE FUNCTION
        myProject.myDataset.average_by_country (
          country STRING, average FLOAT64)
        RETURNS BOOL LANGUAGE js AS R"""
        if (country = "CAN" && average < 5000){
          return 1
        } else if (country = "IND" && average < 1000){
          return 1
        } else { return 0 }
        """;
       
country=CAN の平均取引金額を確認するルールの例。
        myProject.myDataset.average_by_country(
        "CAN",
        (SELECT avg(amount) FROM
          myProject.myDataset.transactions_table
            WHERE currency_id = 'CAN'
        ))
      
テーブルの条件 discount_pct の異常を識別する BigQuery ML 予測句。割引が customercurrencytransaction に基づいて適用されるかどうかを確認します。このルールは、予測が実際の値と一致するかどうかについて、99% 以上の場合を確認します。前提条件: ML モデルは、ルールを使用する前に作成されます。次のコマンドを使用して ML モデルを作成します。
  CREATE MODEL
  model-project-id.dataset-id.model-name
        OPTIONS(model_type='logistic_reg') AS
  SELECT
  IF(discount_pct IS NULL, 0, 1) AS label,
  IFNULL(customer_id, "") AS customer,
  IFNULL(currency_id, "") AS currency,
  IFNULL(amount, 0.0) AS amount
  FROM
  `data-project-id.dataset-id.table-names`
  WHERE transaction_timestamp < '2022-01-01';
  
次のルールで、予測精度が 99% より大きいかを確認します。
      SELECT
        accuracy > 0.99
      FROM
       ML.EVALUATE
        (MODEL model-project-id.dataset-id.model-name,
         (
          SELECT
            customer_id,
            currency_id,
            amount,
            discount_pct
          FROM
            data-project-id.dataset-id.table-names
          WHERE transaction_timestamp > '2022-01-01';
         )
        )
    
行の条件 discount_pct の異常を識別する BigQuery ML 予測関数。この関数は、customercurrencytransaction に基づいて割引を適用するかどうかを確認します。このルールは、予測が一致しなかったすべての発生回数を識別します。前提条件: ML モデルは、ルールを使用する前に作成されます。次のコマンドを使用して ML モデルを作成します。
  CREATE MODEL
  model-project-id.dataset-id.model-name
        OPTIONS(model_type='logistic_reg') AS
  SELECT
  IF(discount_pct IS NULL, 0, 1) AS label,
  IFNULL(customer_id, "") AS customer,
  IFNULL(currency_id, "") AS currency,
  IFNULL(amount, 0.0) AS amount
  FROM
  `data-project-id.dataset-id.table-names`
  WHERE transaction_timestamp < '2022-01-01';
  
次のルールでは、割引予測がすべての行の実際のものと一致するかどうかを確認します。
       IF(discount_pct > 0, 1, 0)
          =(SELECT predicted_label FROM
           ML.PREDICT(
            MODEL model-project-id.dataset-id.model-name,
              (
                SELECT
                  customer_id,
                  currency_id,
                  amount,
                  discount_pct
                FROM
                  data-project-id.dataset-id.table-names AS t
                    WHERE t.transaction_timestamp =
                     transaction_timestamp
                   LIMIT 1
              )
            )
         )
    
SQL アサーション 割引率が 30 以下の行が存在するかを確認して、今日の discount_pct が 30% より大きいかを検証します。 SELECT * FROM my_project_id.dim_dataset.dim_currency WHERE discount_pct <= 30 AND transaction_timestamp >= current_date()
SQL アサーション(データ参照パラメータを指定)

現在サポートされているすべての通貨で discount_pct が 30% より大きいかを確認します。

日付フィルタ transaction_timestamp >= current_date() が、データソース テーブルの行フィルタとして適用されます。

データ参照パラメータ ${data()}my_project_id.dim_dataset.dim_currency WHERE transaction_timestamp >= current_date() のプレースホルダとして機能し、行フィルタを適用します。

SELECT * FROM ${data()} WHERE discount_pct > 30

gcloud CLI を使用してデータ品質ルールを定義する

次の YAML ファイルの例では、組み込み型を使用したサンプルルールおよびカスタム SQL のサンプルルールと同じルールをいくつか使用しています。この YAML ファイルには、フィルタやサンプリング率など、データ品質スキャンの他の仕様も含まれています。gcloud CLI を使用してデータ品質スキャンを作成または更新する際、このような YAML ファイルを --data-quality-spec-file 引数の入力として使用できます。

rules:
- uniquenessExpectation: {}
  column: transaction_id
  dimension: UNIQUENESS
- nonNullExpectation: {}
  column: amount
  dimension: COMPLETENESS
  threshold: 1
- regexExpectation:
    regex: '^[0-9]{8}[a-zA-Z]{16}$'
  column : customer_id
  ignoreNull : true
  dimension : VALIDITY
  threshold : 1
- setExpectation :
    values :
    - 'USD'
    - 'JPY'
    - 'INR'
    - 'GBP'
    - 'CAN'
  column : currency_id
  ignoreNull : true
  dimension : VALIDITY
  threshold : 1
- rangeExpectation:
    minValue : '0'
    maxValue : '100'
  column : discount_pct
  ignoreNull : true
  dimension : VALIDITY
  threshold : 1
- rowConditionExpectation:
    sqlExpression : 0 < `discount_pct` AND `discount_pct` < 100
  column: discount_pct
  dimension: VALIDITY
  threshold: 1
- rowConditionExpectation:
    sqlExpression : currency_id in (select id from `my_project_id.dim_dataset.dim_currency`)
  column: currency_id
  dimension: VALIDITY
  threshold: 1
- tableConditionExpectation:
    sqlExpression : 30 < avg(discount_pct) AND avg(discount_pct) < 50
  dimension: VALIDITY
- rowConditionExpectation:
    sqlExpression : TIMESTAMP(transaction_timestamp) < CURRENT_TIMESTAMP()
  column: transaction_timestamp
  dimension: VALIDITY
  threshold: 1
- sqlAssertion:
    sqlStatement : SELECT * FROM `my_project_id.dim_dataset.dim_currency` WHERE discount_pct > 100
  dimension: VALIDITY
samplingPercent: 50
rowFilter: discount_pct > 100
postScanActions:
  bigqueryExport:
    resultsTable: projects/my_project_id/datasets/dim_dataset/tables/dim_currency
  notificationReport:
    recipients:
      emails:
      - '222larabrown@gmail.com'
      - 'cloudysanfrancisco@gmail.com'
    scoreThresholdTrigger:
      scoreThreshold: 50
    jobFailureTrigger: {}
    jobEndTrigger: {}
catalogPublishingEnabled: true

データ品質スキャンを作成する