データ品質をプロファイリングして検証する

このクイックスタートでは、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. スキャン結果を調べて、テーブルのデータの分布を把握し、データ品質検証の潜在的なターゲットを特定します。[最新のジョブ結果] タブに、Knowledge Catalog は、 **Null %** 、**一意の数と %** 、**上位の値** 、**統計情報の概要** などの列レベルの指標を表示します。

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

    テーブル列 プロファイル結果指標 確認する内容と解釈方法 データ品質検証のターゲット
    duration_minutes 統計情報の概要 [負の値が検出されました]: [最小] 値は -10.0 分です。経過した 乗車時間は負の値にすることはできません。これは、センサーまたは乗車 記録が無効であることを示しています。 経過した乗車時間を正の値にするには、有効性(範囲) ルール( duration_minutes ≥ 1.0など)でターゲットを設定します。
    start_station_id Null % 約 5% の null 値: 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_type、および trip_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 つのディメンションすべてに [**失敗**] のステータスが表示されます。

      • 有効性: 失敗duration_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 に置き換えます。

次のステップ