データ品質のプロファイリングと検証

このクイックスタートでは、Knowledge Catalog(以前の Dataplex Universal Catalog)を使用して BigQuery テーブルのプロファイルを作成し、プロファイル分析情報に基づいてデータ品質ルールを定義して、データ品質スキャンを実行する方法について説明します。

次の手順を完了します。

  1. スキャン機能をテストするために、重複や null 値などの意図的な異常を含むサンプル バイクシェア データを使用して、BigQuery データセットとテーブルを作成します。
  2. テーブルでデータ プロファイル スキャンを作成して実行します。データ プロファイリングでは、null の割合、一意の値の数、値の分布などの列レベルの統計情報が計算されます。詳細については、データのプロファイリングについてをご覧ください。
  3. データ プロファイル スキャン結果を確認して、パターンと潜在的な異常を見つけます。
  4. プロファイルの結果に基づいてデータ品質ルールを定義し、データ品質スキャンを実行します。データ品質スキャンでは、定義されたルールに照らしてデータを検証し、異常を特定します。詳細については、自動データ品質についてをご覧ください。
  5. 評価結果を確認して、どの品質ルールが合格したか、不合格になったかを確認します。

始める前に

プロジェクトを設定します。

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. If you're using an existing project for this guide, verify that you have the permissions required to complete this guide. If you created a new project, then you already have the required permissions.

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Knowledge Catalog and BigQuery APIs.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

必要なロール

データ プロファイル スキャンとデータ品質スキャンの作成と実行、BigQuery リソースの管理に必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

プロジェクトで IAM アクセスを管理するのに必要な権限がある場合は、次の gcloud コマンドを実行して、これらのロールを自分のユーザー アカウントに付与できます。

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="user:USER_EMAIL" \
    --role="roles/dataplex.dataScanEditor"

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="user:USER_EMAIL" \
    --role="roles/bigquery.dataOwner"

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="user:USER_EMAIL" \
    --role="roles/bigquery.jobUser"

次のように置き換えます。

  • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
  • USER_EMAIL: ユーザー アカウントのメールアドレス(例: name@example.com)。

Knowledge Catalog サービス エージェントに権限を付与する

サービス エージェントは、Knowledge Catalog がユーザーの代わりに BigQuery でスキャンクエリを実行するために使用する Google マネージド サービス アカウントです。

  1. Google Cloud コンソールで、ツールバーの [Cloud Shell をアクティブにする] をクリックします。環境のプロビジョニングと接続には数分かかります。

  2. Knowledge Catalog サービス エージェントを作成します。

    gcloud beta services identity create --service=dataplex.googleapis.com
    

    このコマンドは、サービス エージェントがまだプロビジョニングされていない場合に作成し、そのメールアドレスを出力します。プロジェクトに Knowledge Catalog サービス エージェントがすでに存在する場合、コマンドは変更を行わずに既存の ID を返します。

    出力は次のようになります。

    serviceAccount:service-PROJECT_NUMBER@gcp-sa-dataplex.
    

    次のステップのために、出力の PROJECT_NUMBER をメモします。

  3. Knowledge Catalog がプロジェクトでクエリジョブを実行できるように、BigQuery ジョブユーザーroles/bigquery.jobUser)ロールを付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-dataplex." \
       --role="roles/bigquery.jobUser"
    

    次のように置き換えます。

    • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
    • PROJECT_NUMBER: Google Cloud プロジェクトの番号。
  4. サービス エージェントがテーブルのデータとスキーマを読み取れるように、BigQuery データ閲覧者roles/bigquery.dataViewer)ロールを付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-dataplex." \
       --role="roles/bigquery.dataViewer"
    

    次のように置き換えます。

    • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
    • PROJECT_NUMBER: Google Cloud プロジェクトの番号。

サンプル データセットとテーブルを作成する

本番環境のデータに触れることなくプロファイリングとデータ品質スキャンを安全に試すには、専用の BigQuery データセットを設定し、サンプルデータを含むテーブルをプロジェクトに直接作成します。

コンソール

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. [エクスプローラ] ペインで、プロジェクト ID の横にある [アクションを表示] をクリックし、[データセットを作成] をクリックします。

  3. [データセット ID] フィールドに「quickstart_data_profile」と入力します。

  4. [データのロケーション] リストで、[us-central1(アイオワ)] を選択します。

  5. [データセットを作成] をクリックします。

  6. クエリエディタに次の SQL クエリを入力して、bikeshare_trips テーブルにサンプル バイクシェア データを生成します。

    CREATE OR REPLACE TABLE `PROJECT_ID.quickstart_data_profile.bikeshare_trips` AS
    SELECT
    -- Duplicate and null IDs
    IF(MOD(x, 100) = 0, NULL, IF(x > 9900, 1000 + (x - 9900), 1000 + x)) AS trip_id,
    -- Nulls and unrecognized category values
    CASE
      WHEN MOD(x, 50) = 0 THEN 'INVALID_TIER'
      WHEN MOD(x, 25) = 0 THEN NULL
      WHEN MOD(x, 4) = 0 THEN 'Local Rider'
      WHEN MOD(x, 4) = 1 THEN 'Walk Up'
      WHEN MOD(x, 4) = 2 THEN 'Student Membership'
      ELSE 'Weekender'
    END AS subscriber_type,
    -- Nulls and malformed bike IDs
    CASE
      WHEN MOD(x, 60) = 0 THEN 'UNKNOWN'
      WHEN MOD(x, 30) = 0 THEN NULL
      ELSE CAST(2000 + x AS STRING)
    END AS bike_id,
    -- Null dates and future timestamps
    CASE
      WHEN MOD(x, 70) = 0 THEN NULL
      WHEN MOD(x, 40) = 0 THEN TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL x MINUTE)
      ELSE TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL x MINUTE)
    END AS start_time,
    -- Nulls and placeholder station values
    CASE
      WHEN MOD(x, 20) = 0 THEN 'STATION_UNKNOWN'
      WHEN MOD(x, 10) = 0 THEN NULL
      ELSE CAST(100 + MOD(x, 50) AS STRING)
    END AS start_station_id,
    -- Negative durations, zeros, and extreme outliers
    CASE
      WHEN MOD(x, 15) = 0 THEN -10.0
      WHEN MOD(x, 35) = 0 THEN 0.0
      WHEN MOD(x, 200) = 0 THEN 99999.0
      ELSE CAST(MOD(x, 120) + 1.5 AS FLOAT64)
    END AS duration_minutes
    FROM UNNEST(GENERATE_ARRAY(1, 10000)) AS x;

    PROJECT_ID は、実際の Google Cloud プロジェクト ID に置き換えます。

  7. [ 実行] をクリックします。

gcloud

  1. Cloud Shell で、us-central1 リージョンに quickstart_data_profile データセットを作成します。

    bq --location=us-central1 mk --dataset PROJECT_ID:quickstart_data_profile
    

    PROJECT_ID は、実際のGoogle Cloud プロジェクト ID に置き換えます。

  2. bikeshare_trips サンプル テーブルを作成してデータを入力します。

    bq query \
    --use_legacy_sql=false \
    "CREATE OR REPLACE TABLE \`PROJECT_ID.quickstart_data_profile.bikeshare_trips\` AS
    SELECT
      IF(MOD(x, 100) = 0, NULL, IF(x > 9900, 1000 + (x - 9900), 1000 + x)) AS trip_id,
      CASE
        WHEN MOD(x, 50) = 0 THEN 'INVALID_TIER'
        WHEN MOD(x, 25) = 0 THEN NULL
        WHEN MOD(x, 4) = 0 THEN 'Local Rider'
        WHEN MOD(x, 4) = 1 THEN 'Walk Up'
        WHEN MOD(x, 4) = 2 THEN 'Student Membership'
        ELSE 'Weekender'
      END AS subscriber_type,
      CASE
        WHEN MOD(x, 60) = 0 THEN 'UNKNOWN'
        WHEN MOD(x, 30) = 0 THEN NULL
        ELSE CAST(2000 + x AS STRING)
      END AS bike_id,
      CASE
        WHEN MOD(x, 70) = 0 THEN NULL
        WHEN MOD(x, 40) = 0 THEN TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL x MINUTE)
        ELSE TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL x MINUTE)
      END AS start_time,
      CASE
        WHEN MOD(x, 20) = 0 THEN 'STATION_UNKNOWN'
        WHEN MOD(x, 10) = 0 THEN NULL
        ELSE CAST(100 + MOD(x, 50) AS STRING)
      END AS start_station_id,
      CASE
        WHEN MOD(x, 15) = 0 THEN -10.0
        WHEN MOD(x, 35) = 0 THEN 0.0
        WHEN MOD(x, 200) = 0 THEN 99999.0
        ELSE CAST(MOD(x, 120) + 1.5 AS FLOAT64)
      END AS duration_minutes
    FROM UNNEST(GENERATE_ARRAY(1, 10000)) AS x;"
    

データ プロファイル スキャンを作成して実行する

データ プロファイル スキャンでは、テーブルの行全体を調べて、一意の値の数、null 比率、データ分布の範囲などの統計情報を計算します。

コンソール

  1. Google Cloud コンソールで、[データのプロファイリングと品質] ページに移動します。

    [データのプロファイリングと品質] に移動

  2. [データ プロファイル スキャンの作成] をクリックします。

  3. [タイプの選択] で、[データ プロファイル スキャン] を選択したままにします。

  4. [全般] の [表示名] フィールドに「bikeshare-trips-profile」と入力します。

  5. [スキャンするテーブル] の [テーブル] フィールドで、[参照] をクリックし、プロジェクトで quickstart_data_profile.bikeshare_trips テーブルを選択して、[選択] をクリックします。

  6. [モード] で [標準] を選択します。

  7. [スコープ] で [データ全体] を選択します。

  8. [スケジュール] で [オンデマンド] を選択します。

  9. 他の設定はデフォルトのままにします。

  10. [スキャンを実行] をクリックします。

    スキャンジョブが開始されます。通常、Knowledge Catalog がスキャンを実行してテーブルの統計情報を計算するまでに 3 ~ 5 分かかります。

gcloud

  1. Cloud Shell で、データ プロファイル スキャンを作成します。

    gcloud dataplex datascans create data-profile bikeshare-trips-profile \
     --location=us-central1 \
     --data-source-resource="//bigquery.googleapis.com/projects/PROJECT_ID/datasets/quickstart_data_profile/tables/bikeshare_trips" \
     --description="Data profile scan for sample bikeshare dataset"
    

    PROJECT_ID は、実際のGoogle Cloud プロジェクト ID に置き換えます。

  2. データ プロファイル スキャンを実行します。

    gcloud dataplex datascans run bikeshare-trips-profile \
     --location=us-central1
    

    スキャン ジョブがバックグラウンドで開始されます。通常、スキャンが完了するまでに 3 ~ 5 分かかります。

データ プロファイル スキャンの結果を確認する

スキャンが完了したら、列の統計情報を確認して、データの特性を把握します。

  1. Google Cloud コンソールで、[データのプロファイリングと品質] ページに移動します。

    [データのプロファイリングと品質] に移動

  2. スキャンのリストで、[bikeshare-trips-profile] をクリックします。

  3. スキャンがまだ実行されていない場合は、[今すぐ実行] をクリックします。

  4. [概要] セクションで、最新のスキャンジョブが [成功] と表示されるまで待ちます。

    次の図は、[概要] セクションの [成功] ステータスのスキャンジョブを示しています。

    ジョブのステータスが成功と表示され、[結果を表示] リンクが表示されている、自転車シェアリングの乗車プロファイル スキャンの概要セクション。

  5. スキャン結果を調べて、テーブルのデータ分布を把握し、データ品質検証の潜在的なターゲットを特定します。[最新のジョブ結果] タブには、Null の割合一意の値の数と割合上位の値要約統計情報など、列レベルの指標が表示されます。

    次の表に、各テーブル列で確認するプロファイル指標、結果の解釈方法、ターゲットとするデータ品質ルールを示します。

    テーブル列 プロファイル結果指標 確認事項と解釈方法 データ品質の検証ターゲット
    duration_minutes 統計情報の概要 負の値が検出されました: 最小値は -10.0 分です。経過した乗車時間は負の値にできません。これは、センサーまたは乗車記録が無効であることを示します。 有効性(範囲)ルール(duration_minutes ≥ 1.0 など)でターゲットを設定し、乗車時間の経過が正の値であることを必須にします。
    start_station_id Null %(Null の割合) NULL 値が約 5%: NULL の割合が 0% より大きいため、一部のレコードにステーションのチェックアウト ID がないことがわかります(ドックレスやキオスクレスの乗車など)。 完全性(非 null)ルールを使用して、駅 ID が欠落しているレコードをキャッチしてフラグを設定します。
    subscriber_type 上位の値 予期しないカテゴリ: 頻度の高い値のリストに、有効なメンバーシップ ティアとともに標準外のカテゴリ(INVALID_TIER など)が表示されている場合、ユーザー入力の検証ができていないか、取り込みに問題があることを示しています。 有効性(セット)ルールでターゲットを設定して、受信したすべての値がメンバーシップ タイプの許可リストに属するようにします。
    trip_id ユニーク数と割合(%) 重複する ID が検出されました: 一意性が 100% 未満(約 98%)で、識別子レコードが繰り返されていることを示しています。主キーと乗車 ID は 100% 一意である必要があります。 一意性ルールでターゲットを設定して、重複する乗車記録にフラグを設定し、重複を防止します。

これらのプロファイル結果は、ターゲット データ品質ルールを作成するためのエビデンスに基づくベースラインを提供します。

データ品質スキャンを作成して実行する

データの概要を把握したら、データ品質の自動化ルールを設定して異常を検出します。このステップでは、プロファイル検出結果に基づいて 4 つの一般的なルールタイプを構成します。

コンソール

  1. Google Cloud コンソールで、[データのプロファイリングと品質] ページに移動します。

    [データのプロファイリングと品質] に移動

  2. [データ品質スキャンの作成] をクリックします。

  3. [全般] の [表示名] フィールドに「bikeshare-trips-quality」と入力します。

  4. [スキャンするテーブル] の [テーブル] フィールドで、[参照] をクリックし、quickstart_data_profile.bikeshare_trips テーブルを選択して、[選択] をクリックします。

  5. [スコープ] で [データ全体] を選択します。

  6. [スケジュール] で [オンデマンド] を選択します。

  7. その他の設定はデフォルトのままにして、[続行] をクリックします。

  8. [データ品質ルール] セクションで、[ルールを追加] をクリックし、[組み込みルールタイプ] を選択します。

  9. [ルールを追加] パネルで、列とルールの種類を選択します。

    • [列を選択] フィールドで、[参照] をクリックし、duration_minutesstart_station_idsubscriber_typetrip_id を選択します。
    • [選択] をクリックします。
    • [ルールの種類を選択] リストで、[範囲チェック]、[NULL チェック]、[値セット チェック]、[一意性チェック] を選択し、[OK] をクリックします。
    • 生成されたルールのリストで、次の各ルールのチェックボックスをオンにします。

      • duration_minutes: 範囲チェック
      • start_station_id: NULL チェック
      • subscriber_type: 値セットのチェック
      • trip_id: 一意性チェック
    • [選択] をクリックします。

  10. [データ品質ルール] テーブルで、値を必要とするルールのパラメータを構成します。

    • duration_minutes範囲チェック)の場合は、 [編集] をクリックし、[最小値] フィールドに 1.0 を入力して、[保存] をクリックします。
    • subscriber_type値セットのチェック)で、 [編集] をクリックし、[値を追加] をクリックして、許可されている各値(Local RiderWalk UpStudent MembershipWeekender)を追加し、[保存] をクリックします。
  11. [続行] をクリックして [スキャンを実行] をクリックします。

gcloud

  1. Cloud Shell で、プロファイルで見つかった異常をターゲットとするルール仕様を含む dq_bikeshare.yaml という名前のファイルを作成します。

    cat << 'EOF' > dq_bikeshare.yaml
    rules:
      - column: trip_id
        dimension: UNIQUENESS
        uniquenessExpectation: {}
      - column: start_station_id
        dimension: COMPLETENESS
        nonNullExpectation: {}
      - column: duration_minutes
        dimension: VALIDITY
        rangeExpectation:
          minValue: "1.0"
      - column: subscriber_type
        dimension: VALIDITY
        setExpectation:
          values:
            - "Local Rider"
            - "Walk Up"
            - "Student Membership"
            - "Weekender"
    EOF
    
  2. データ品質スキャンを作成します。

    gcloud dataplex datascans create data-quality bikeshare-trips-quality \
     --location=us-central1 \
     --data-source-resource="//bigquery.googleapis.com/projects/PROJECT_ID/datasets/quickstart_data_profile/tables/bikeshare_trips" \
     --data-quality-spec-file="dq_bikeshare.yaml" \
     --description="Data quality scan for sample bikeshare dataset"
    

    PROJECT_ID は、実際のGoogle Cloud プロジェクト ID に置き換えます。

  3. データ品質スキャンを実行します。

    gcloud dataplex datascans run bikeshare-trips-quality \
     --location=us-central1
    

データ品質ルールの評価を確認する

データ品質の結果を確認して、ルールがサンプルデータをどのように評価し、異常を特定したかを確認します。

  1. Google Cloud コンソールで、[データのプロファイリングと品質] ページに移動します。

    [データのプロファイリングと品質] に移動

  2. [スキャン] テーブルで、[bikeshare-trips-quality] スキャンをクリックします。

  3. [概要] セクションで、[結果を表示] をクリックしてジョブの詳細を開きます。

  4. [ジョブの詳細] パネルで、評価結果を確認します。

    • データ品質のステータス: 想定どおり、評価された 3 つのディメンションすべてでステータスが [失敗] と表示されます。

      • Validity: Failedduration_minutes 列に負の値が含まれており、subscriber_type に無効なメンバーシップ値(INVALID_TIER)が含まれています。
      • 完全性: 失敗start_station_id 列には NULL 値が含まれています。
      • 一意性: 失敗trip_id 列に重複するレコードが含まれています。
    • ルール: [ルール] テーブルでは、評価された 4 つのルールすべてが [失敗] ステータスになっています。

      • duration_minutes: 範囲チェック(失敗
      • start_station_id: NULL チェック(失敗
      • subscriber_type: 値セットのチェック(失敗
      • trip_id: 一意性チェック(失敗

      失敗したルールについては、[失敗したレコードを取得するクエリ] 列の SQL クエリをコピーして BigQuery で実行し、無効な行を分離して検査できます。

これで、BigQuery テーブルのプロファイリングを行い、列の統計情報を検出しました。また、これらの分析情報を使用して、自動データ品質ルールを定義して検証しました。

クリーンアップ

このページで使用したリソースについて、 Google Cloud アカウントに課金されないようにするには、次の手順を実施します。

コンソール

  1. Google Cloud コンソールで、[データのプロファイリングと品質] ページに移動します。

    [データのプロファイリングと品質] に移動

  2. [スキャン] テーブルで、[bikeshare-trips-quality] と [bikeshare-trips-profile] を選択します。

  3. [削除] をクリックして、確定します。

  4. [BigQuery] ページに移動します。

    [BigQuery] に移動

  5. [エクスプローラ] ペインで [データセット] をクリックします。

  6. quickstart_data_profile データセットを選択し、[削除] をクリックします。

gcloud

Cloud Shell で、データ品質スキャン、データ プロファイル スキャン、サンプル データセットを削除します。

gcloud dataplex datascans delete bikeshare-trips-quality --location=us-central1 --quiet
gcloud dataplex datascans delete bikeshare-trips-profile --location=us-central1 --quiet
bq rm -r -f -d PROJECT_ID:quickstart_data_profile

PROJECT_ID は、実際のGoogle Cloud プロジェクト ID に置き換えます。

次のステップ