データ品質のプロファイリングと検証
このクイックスタートでは、Knowledge Catalog(以前の Dataplex Universal Catalog)を使用して BigQuery テーブルのプロファイルを作成し、プロファイル分析情報に基づいてデータ品質ルールを定義して、データ品質スキャンを実行する方法について説明します。
次の手順を完了します。
- スキャン機能をテストするために、重複や null 値などの意図的な異常を含むサンプル バイクシェア データを使用して、BigQuery データセットとテーブルを作成します。
- テーブルでデータ プロファイル スキャンを作成して実行します。データ プロファイリングでは、null の割合、一意の値の数、値の分布などの列レベルの統計情報が計算されます。詳細については、データのプロファイリングについてをご覧ください。
- データ プロファイル スキャン結果を確認して、パターンと潜在的な異常を見つけます。
- プロファイルの結果に基づいてデータ品質ルールを定義し、データ品質スキャンを実行します。データ品質スキャンでは、定義されたルールに照らしてデータを検証し、異常を特定します。詳細については、自動データ品質についてをご覧ください。
- 評価結果を確認して、どの品質ルールが合格したか、不合格になったかを確認します。
始める前に
プロジェクトを設定します。
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
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.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Knowledge Catalog and BigQuery APIs.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. 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.
必要なロール
データ プロファイル スキャンとデータ品質スキャンの作成と実行、BigQuery リソースの管理に必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。
-
データスキャンの作成、実行、削除: Dataplex DataScan 編集者 (
roles/dataplex.dataScanEditor) -
サンプル テーブルの作成、入力、削除: BigQuery データオーナー (
roles/bigquery.dataOwner) -
BigQuery で SQL クエリを実行する: BigQuery ジョブユーザー (
roles/bigquery.jobUser)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
プロジェクトで 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 マネージド サービス アカウントです。
Google Cloud コンソールで、ツールバーの [Cloud Shell をアクティブにする] をクリックします。環境のプロビジョニングと接続には数分かかります。
Knowledge Catalog サービス エージェントを作成します。
gcloud beta services identity create --service=dataplex.googleapis.comこのコマンドは、サービス エージェントがまだプロビジョニングされていない場合に作成し、そのメールアドレスを出力します。プロジェクトに Knowledge Catalog サービス エージェントがすでに存在する場合、コマンドは変更を行わずに既存の ID を返します。
出力は次のようになります。
serviceAccount:service-PROJECT_NUMBER@gcp-sa-dataplex.次のステップのために、出力の
PROJECT_NUMBERをメモします。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 プロジェクトの番号。
サービス エージェントがテーブルのデータとスキーマを読み取れるように、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 データセットを設定し、サンプルデータを含むテーブルをプロジェクトに直接作成します。
コンソール
Google Cloud コンソールで、[BigQuery] ページに移動します。
[エクスプローラ] ペインで、プロジェクト ID の横にある [アクションを表示] をクリックし、[データセットを作成] をクリックします。
[データセット ID] フィールドに「
quickstart_data_profile」と入力します。[データのロケーション] リストで、[us-central1(アイオワ)] を選択します。
[データセットを作成] をクリックします。
クエリエディタに次の 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 に置き換えます。[ 実行] をクリックします。
gcloud
Cloud Shell で、
us-central1リージョンにquickstart_data_profileデータセットを作成します。bq --location=us-central1 mk --dataset PROJECT_ID:quickstart_data_profile
PROJECT_IDは、実際のGoogle Cloud プロジェクト ID に置き換えます。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 比率、データ分布の範囲などの統計情報を計算します。
コンソール
Google Cloud コンソールで、[データのプロファイリングと品質] ページに移動します。
[データ プロファイル スキャンの作成] をクリックします。
[タイプの選択] で、[データ プロファイル スキャン] を選択したままにします。
[全般] の [表示名] フィールドに「
bikeshare-trips-profile」と入力します。[スキャンするテーブル] の [テーブル] フィールドで、[参照] をクリックし、プロジェクトで
quickstart_data_profile.bikeshare_tripsテーブルを選択して、[選択] をクリックします。[モード] で [標準] を選択します。
[スコープ] で [データ全体] を選択します。
[スケジュール] で [オンデマンド] を選択します。
他の設定はデフォルトのままにします。
[スキャンを実行] をクリックします。
スキャンジョブが開始されます。通常、Knowledge Catalog がスキャンを実行してテーブルの統計情報を計算するまでに 3 ~ 5 分かかります。
gcloud
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 に置き換えます。データ プロファイル スキャンを実行します。
gcloud dataplex datascans run bikeshare-trips-profile \ --location=us-central1
スキャン ジョブがバックグラウンドで開始されます。通常、スキャンが完了するまでに 3 ~ 5 分かかります。
データ プロファイル スキャンの結果を確認する
スキャンが完了したら、列の統計情報を確認して、データの特性を把握します。
Google Cloud コンソールで、[データのプロファイリングと品質] ページに移動します。
スキャンのリストで、[bikeshare-trips-profile] をクリックします。
スキャンがまだ実行されていない場合は、[今すぐ実行] をクリックします。
[概要] セクションで、最新のスキャンジョブが [成功] と表示されるまで待ちます。
次の図は、[概要] セクションの [成功] ステータスのスキャンジョブを示しています。
スキャン結果を調べて、テーブルのデータ分布を把握し、データ品質検証の潜在的なターゲットを特定します。[最新のジョブ結果] タブには、Null の割合、一意の値の数と割合、上位の値、要約統計情報など、列レベルの指標が表示されます。
次の表に、各テーブル列で確認するプロファイル指標、結果の解釈方法、ターゲットとするデータ品質ルールを示します。
テーブル列 プロファイル結果指標 確認事項と解釈方法 データ品質の検証ターゲット duration_minutes統計情報の概要 負の値が検出されました: 最小値は -10.0分です。経過した乗車時間は負の値にできません。これは、センサーまたは乗車記録が無効であることを示します。有効性(範囲)ルール( duration_minutes ≥ 1.0など)でターゲットを設定し、乗車時間の経過が正の値であることを必須にします。start_station_idNull %(Null の割合) NULL 値が約 5%: NULL の割合が 0% より大きいため、一部のレコードにステーションのチェックアウト ID がないことがわかります(ドックレスやキオスクレスの乗車など)。 完全性(非 null)ルールを使用して、駅 ID が欠落しているレコードをキャッチしてフラグを設定します。 subscriber_type上位の値 予期しないカテゴリ: 頻度の高い値のリストに、有効なメンバーシップ ティアとともに標準外のカテゴリ( INVALID_TIERなど)が表示されている場合、ユーザー入力の検証ができていないか、取り込みに問題があることを示しています。有効性(セット)ルールでターゲットを設定して、受信したすべての値がメンバーシップ タイプの許可リストに属するようにします。 trip_idユニーク数と割合(%) 重複する ID が検出されました: 一意性が 100% 未満(約 98%)で、識別子レコードが繰り返されていることを示しています。主キーと乗車 ID は 100% 一意である必要があります。 一意性ルールでターゲットを設定して、重複する乗車記録にフラグを設定し、重複を防止します。
これらのプロファイル結果は、ターゲット データ品質ルールを作成するためのエビデンスに基づくベースラインを提供します。
データ品質スキャンを作成して実行する
データの概要を把握したら、データ品質の自動化ルールを設定して異常を検出します。このステップでは、プロファイル検出結果に基づいて 4 つの一般的なルールタイプを構成します。
コンソール
Google Cloud コンソールで、[データのプロファイリングと品質] ページに移動します。
[データ品質スキャンの作成] をクリックします。
[全般] の [表示名] フィールドに「
bikeshare-trips-quality」と入力します。[スキャンするテーブル] の [テーブル] フィールドで、[参照] をクリックし、
quickstart_data_profile.bikeshare_tripsテーブルを選択して、[選択] をクリックします。[スコープ] で [データ全体] を選択します。
[スケジュール] で [オンデマンド] を選択します。
その他の設定はデフォルトのままにして、[続行] をクリックします。
[データ品質ルール] セクションで、[ルールを追加] をクリックし、[組み込みルールタイプ] を選択します。
[ルールを追加] パネルで、列とルールの種類を選択します。
- [列を選択] フィールドで、[参照] をクリックし、
duration_minutes、start_station_id、subscriber_type、trip_idを選択します。 - [選択] をクリックします。
- [ルールの種類を選択] リストで、[範囲チェック]、[NULL チェック]、[値セット チェック]、[一意性チェック] を選択し、[OK] をクリックします。
生成されたルールのリストで、次の各ルールのチェックボックスをオンにします。
duration_minutes: 範囲チェックstart_station_id: NULL チェックsubscriber_type: 値セットのチェックtrip_id: 一意性チェック
[選択] をクリックします。
- [列を選択] フィールドで、[参照] をクリックし、
[データ品質ルール] テーブルで、値を必要とするルールのパラメータを構成します。
duration_minutes(範囲チェック)の場合は、 [編集] をクリックし、[最小値] フィールドに1.0を入力して、[保存] をクリックします。subscriber_type(値セットのチェック)で、 [編集] をクリックし、[値を追加] をクリックして、許可されている各値(Local Rider、Walk Up、Student Membership、Weekender)を追加し、[保存] をクリックします。
[続行] をクリックして [スキャンを実行] をクリックします。
gcloud
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データ品質スキャンを作成します。
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 に置き換えます。データ品質スキャンを実行します。
gcloud dataplex datascans run bikeshare-trips-quality \ --location=us-central1
データ品質ルールの評価を確認する
データ品質の結果を確認して、ルールがサンプルデータをどのように評価し、異常を特定したかを確認します。
Google Cloud コンソールで、[データのプロファイリングと品質] ページに移動します。
[スキャン] テーブルで、[bikeshare-trips-quality] スキャンをクリックします。
[概要] セクションで、[結果を表示] をクリックしてジョブの詳細を開きます。
[ジョブの詳細] パネルで、評価結果を確認します。
データ品質のステータス: 想定どおり、評価された 3 つのディメンションすべてでステータスが [失敗] と表示されます。
- Validity: Failed。
duration_minutes列に負の値が含まれており、subscriber_typeに無効なメンバーシップ値(INVALID_TIER)が含まれています。 - 完全性: 失敗。
start_station_id列には NULL 値が含まれています。 - 一意性: 失敗。
trip_id列に重複するレコードが含まれています。
- Validity: Failed。
ルール: [ルール] テーブルでは、評価された 4 つのルールすべてが [失敗] ステータスになっています。
duration_minutes: 範囲チェック(失敗)start_station_id: NULL チェック(失敗)subscriber_type: 値セットのチェック(失敗)trip_id: 一意性チェック(失敗)
失敗したルールについては、[失敗したレコードを取得するクエリ] 列の SQL クエリをコピーして BigQuery で実行し、無効な行を分離して検査できます。
これで、BigQuery テーブルのプロファイリングを行い、列の統計情報を検出しました。また、これらの分析情報を使用して、自動データ品質ルールを定義して検証しました。
クリーンアップ
このページで使用したリソースについて、 Google Cloud アカウントに課金されないようにするには、次の手順を実施します。
コンソール
Google Cloud コンソールで、[データのプロファイリングと品質] ページに移動します。
[スキャン] テーブルで、[bikeshare-trips-quality] と [bikeshare-trips-profile] を選択します。
[削除] をクリックして、確定します。
[BigQuery] ページに移動します。
[エクスプローラ] ペインで [データセット] をクリックします。
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 に置き換えます。