チュートリアル:データメトリック関数入門

概要

このチュートリアルは、 Snowsight のワークシートを使用するか、 SnowSQL などの CLI クライアントを使用して完了できます。コード例を貼り付けて実行します。

このチュートリアルが修了するまでには、次の方法を学習します。

  • データ品質を測定するためのカスタムデータメトリック関数(DMF)を作成します。

  • DMFを管理して、サーバーレスクレジット使用状況を最適化します。

  • スケジュールされたDMFの呼び出しに関連するサーバーレスのクレジット使用状況を監視します。

アクセス制御の設定

このチュートリアルを完了するには、以下のような必要なアクセス権をすべて持つ単一のカスタムロールを使用してください:

  • データベースを作成することで、スキーマの作成、スキーマ内のDMFの作成、スキーマ内のテーブルの作成が可能になります。

  • クエリ操作を実行するウェアハウスの作成

  • スケジュールされたDMFを呼び出した結果を含むビューのクエリ

  • サーバーレスコンピューティング使用情報を含むビューのクエリ

チュートリアル全体で使用する dq_tutorial_role ロールを作成します。

USE ROLE ACCOUNTADMIN;
CREATE ROLE IF NOT EXISTS dq_tutorial_role;
Copy

権限を付与し、アプリケーションロールとデータベースロールを dq_tutorial_role に付与します。

GRANT CREATE DATABASE ON ACCOUNT TO ROLE dq_tutorial_role;
GRANT EXECUTE DATA METRIC FUNCTION ON ACCOUNT TO ROLE dq_tutorial_role;
GRANT APPLICATION ROLE SNOWFLAKE.DATA_QUALITY_MONITORING_VIEWER TO ROLE dq_tutorial_role;
GRANT DATABASE ROLE SNOWFLAKE.USAGE_VIEWER TO ROLE dq_tutorial_role;
GRANT DATABASE ROLE SNOWFLAKE.DATA_METRIC_USER TO ROLE dq_tutorial_role;
Copy

データを含むテーブルをクエリするウェアハウスを作成し、 dq_tutorial_role ロールにロールの USAGE 権限を付与します。

CREATE WAREHOUSE IF NOT EXISTS dq_tutorial_wh;
GRANT USAGE ON WAREHOUSE dq_tutorial_wh TO ROLE dq_tutorial_role;
Copy

dq_tutorial_role ロールへの付与を確認します。

SHOW GRANTS TO ROLE dq_tutorial_role;
Copy

ロール階層を確立し、このチュートリアルを完了できるユーザーにロールを付与します(jsmith の値を置換します)。

GRANT ROLE dq_tutorial_role TO ROLE SYSADMIN;
GRANT ROLE dq_tutorial_role TO USER jsmith;
Copy

データ設定

このチュートリアルのデータやDMFの管理をしやすくするために、これらのオブジェクトを格納する専用のデータベースを作成します。

テーブルを作成する

USE ROLE dq_tutorial_role;
CREATE DATABASE IF NOT EXISTS dq_tutorial_db;
CREATE SCHEMA IF NOT EXISTS sch;

CREATE TABLE customers (
  account_number NUMBER(38,0),
  first_name VARCHAR(16777216),
  last_name VARCHAR(16777216),
  email VARCHAR(16777216),
  phone VARCHAR(16777216),
  created_at TIMESTAMP_NTZ(9),
  street VARCHAR(16777216),
  city VARCHAR(16777216),
  state VARCHAR(16777216),
  country VARCHAR(16777216),
  zip_code NUMBER(38,0)
);
Copy

テーブルに値を挿入する

テーブルにデータを追加します。

USE WAREHOUSE dq_tutorial_wh;

INSERT INTO customers (account_number, city, country, email, first_name, last_name, phone, state, street, zip_code)
  VALUES (1589420, 'san francisco', 'usa', 'john.doe@', 'john', 'doe', 1234567890, null, null, null);

INSERT INTO customers (account_number, city, country, email, first_name, last_name, phone, state, street, zip_code)
  VALUES (8028387, 'san francisco', 'usa', 'bart.simpson@example.com', 'bart', 'simpson', 1012023030, null, 'market st', 94102);

INSERT INTO customers (account_number, city, country, email, first_name, last_name, phone, state, street, zip_code)
  VALUES
    (1589420, 'san francisco', 'usa', 'john.doe@example.com', 'john', 'doe', 1234567890, 'ca', 'concar dr', 94402),
    (2834123, 'san mateo', 'usa', 'jane.doe@example.com', 'jane', 'doe', 3641252911, 'ca', 'concar dr', 94402),
    (4829381, 'san mateo', 'usa', 'jim.doe@example.com', 'jim', 'doe', 3641252912, 'ca', 'concar dr', 94402),
    (9821802, 'san francisco', 'usa', 'susan.smith@example.com', 'susan', 'smith', 1234567891, 'ca', 'geary st', 94121),
    (8028387, 'san francisco', 'usa', 'bart.simpson@example.com', 'bart', 'simpson', 1012023030, 'ca', 'market st', 94102);
Copy

DMFsを作成して処理する

以下のセクションでは、無効なメールアドレスのカウントを測定するために、ユーザー定義のDMFを作成し、その後以下のことを行います。

  • DMFを5分ごとに実行するようにスケジュールします。

  • DMFテーブル参照を確認します(DMFが設定されているテーブルを探します)。

  • スケジュールされたDMFを呼び出した結果を含む組み込みビューをクエリします。

  • 不必要なサーバーレスのクレジット使用状況を避けるため、テーブルからDMFの設定を解除します。

DMF の作成

指定した正規表現に一致しない列のメールアドレスの数を返すデータメトリック関数(DMF)を作成します。

CREATE DATA METRIC FUNCTION IF NOT EXISTS
  invalid_email_count (ARG_T table(ARG_C1 STRING))
  RETURNS NUMBER AS
  'SELECT COUNT_IF(FALSE = (
    ARG_C1 REGEXP ''^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$''))
    FROM ARG_T';
Copy

テーブルにスケジュールを設定する

DMFスケジュールは、テーブルのすべてのDMFsがいつ実行されるかを定義します。現在のところ、5分が設定可能な下限です。

ALTER TABLE customers SET DATA_METRIC_SCHEDULE = '5 MINUTE';
Copy

注釈

チュートリアルの目的上、スケジュールは5分に設定されています。しかし、DMFユースケースを最適化した後、テーブルに影響を与えるDMLの操作に関連するcron式やトリガーイベントなど、他のスケジュール設定を試してみてください。

DMFsをテーブルに設定し、参照を確認します。

DMFをテーブルに関連付ける:

ALTER TABLE customers ADD DATA METRIC FUNCTION
  invalid_email_count ON (email);
Copy

スケジュールは5分間にセットされているため、SnowflakeがDMFを呼び出して結果を処理するまで5分間待つ必要があります。とりあえず、 DATA_METRIC_FUNCTION_REFERENCES Information Schemaテーブル関数を呼び出すことで、DMF がテーブルに関連付けられていることを確認できます。

SELECT * FROM TABLE(INFORMATION_SCHEMA.DATA_METRIC_FUNCTION_REFERENCES(
  REF_ENTITY_NAME => 'dq_tutorial_db.sch.customers',
  REF_ENTITY_DOMAIN => 'TABLE'));
Copy

DMF結果を表示する

スケジュールされたDMFを呼び出した結果はDATA_QUALITY_MONITORING_RESULTSビューに保存されます。無効なメールアドレスの数を調べるには、 DATA_QUALITY_MONITORING_RESULTS ビューをクエリして、スケジュールされた DMF を呼び出した結果を確認します。

SELECT scheduled_time, measurement_time, table_name, metric_name, value
FROM SNOWFLAKE.LOCAL.DATA_QUALITY_MONITORING_RESULTS
WHERE TRUE
AND METRIC_NAME = 'INVALID_EMAIL_COUNT'
AND METRIC_DATABASE = 'DQ_TUTORIAL_DB'
LIMIT 100;
Copy

その結果では、 value 列に 1 が含まれていることがわかります。この数は、 テーブルに値を挿入する セクションの最初の INSERT ステートメントに対応する、不適切な形式のメールアドレス1件に対応します。

テーブルからDMFsの設定を解除します。

DMFの定義、スケジュール、および予想される結果に基づいて、DMFが予想通りに機能していることを確認しました。

不必要なサーバーレスのクレジット使用状況を避けるために、テーブルからDMFの設定を解除します。

ALTER TABLE customers DROP DATA METRIC FUNCTION
  invalid_email_count ON (email);
Copy

DMF を使用すると、失敗した記録を返します。

このセクションでは、値が空白であったためにデータ品質チェックに失敗した記録を返します。

データ品質メトリック関数は、品質チェックに失敗したデータを含む行を識別します。データメトリックスキャンを実行して、これらの記録を抽出して返すことができます。

DMF で識別される行を返すには、以下の手順に従います。

  • テーブルを作成します。

  • テーブルに不良記録を追加します。

  • データ メトリック スキャンを実行して、空白値の記録を返します。

  • スキャン結果を表示します。

  • 新しい値で記録を更新します。

テーブルを作成する

以下のステートメントを貼り付けて実行し、テーブルを作成します。

CREATE or REPLACE table dq_tutorial_db.sch.employeesTable (
  id NUMBER,
  name VARCHAR,
  last_name VARCHAR,
  email VARCHAR,
  zip_code NUMBER
 );
Copy

テーブルに値を挿入する

空白値などの不良レコードがいくつかあるデータをテーブルに追加します。

INSERT INTO dq_tutorial_db.sch.employeesTable (id, name, last_name, email, zip_code)
VALUES
  (8, 'John', 'Doe', 'johndoe@example.com', 12345),
  (23, '', 'Smith', 'smithj@example.com', 23456),
  (1, NULL, 'Taylor', 'taylorj@example.com', 34567),
  (99, 'Jane', 'Adams', 'jadams@example.com', 45678),
  (50, 'Alice', 'Brown', '', 56789),
  (51, NULL, 'Lee', 'lee@example.com', 67890),
  (234, 'Michael', '', 'michael@example.com', 78901),
  (56, 'Sara', 'Jones', 'sjones@example.com', 89012),
  (11, '', NULL, 'blanklast@example.com', 90123),
  (12, 'Tom', 'Harris', NULL, 10234);
Copy

BLANK_COUNT データメトリック関数を実行して空白値の数を返します。

BLANK_COUNT データメトリック関数を実行し、空白値の数を返します。

SELECT snowflake.core.blank_count (SELECT name FROM dq_tutorial_db.sch.employeesTable)
Copy

SYSTEM$DATA_METRIC_SCAN 関数を実行して行を返します。

name 列に空白値を含むテーブル行を返すには、 SYSTEM$DATA_METRIC_SCAN 関数を name 列に対して実行します。

SELECT *
  FROM TABLE(SYSTEM$DATA_METRIC_SCAN(
    REF_ENTITY_NAME  => 'dq_tutorial_db.sch.employeesTable',
    METRIC_NAME  => 'snowflake.core.blank_count',
    ARGUMENT_NAME => 'name'
   ));
Copy

システムメトリックスキャン結果の表示

その結果、 employeeTable テーブルの空白値を含む行が表示されます。

+-----+-------+--------------+-----------------------+-----------+------- --+
| ID  | NAME  | LAST_NAME    | EMAIL                 | CREATEDAT | ZIP_CODE |
|-----+-------+--------------+-----------------------+----------------------|
| 23  |       |   Smith      | smith@example.com     | null      | 23456    |
| 11  |       |   null       | blanklast@example.com | null      | 90123    |
+-----+-------+--------------+-----------------------+-----------+----------+

新しい値で記録を更新

name 列の空白値を置換するには、 SYSTEM$DATA_METRIC_SCAN 関数を含むクエリをターゲット・テーブルで実行します。システム関数が返す各行に対して UPDATE コマンドを実行することで、 name 列の空白値を NULL にセットします。

UPDATE dq_tutorial_db.sch.employeesTable
  SET name = null
  WHERE dq_tutorial_db.sch.employeesTable.ID IN (
    select ID from table(system$data_metric_scan(
  REF_ENTITY_NAME => 'dq_tutorial_db.sch.employeesTable',
  METRIC_NAME => 'snowflake.core.blank_count',
  ARGUMENT_NAME => 'name'
  )));
Copy

値を更新した後、以下を実行すると0が返されます。

SELECT snowflake.core.blank_count (SELECT name FROM dq_tutorial_db.sch.employeesTable)
Copy

このセクションでは、品質チェックに失敗したデータを含む記録を抽出しました。次のセクションでは、サーバーレスのクレジット消費量を表示する方法を学びます。

サーバーレスクレジット消費量を表示する

スケジュールされたデータメトリック関数(DMFs)を呼び出すには、 サーバーレスコンピューティングリソース が必要です。Account Usageビュー DATA_QUALITY_MONITORING_USAGE_HISTORY をクエリして、 DMF サーバーレスコンピューティングコスト を表示できます。

ビューには1~2時間の遅延があるため、その時間が経過してからクエリを実行します。このステップには後で戻ることができます。

ビューをクエリし、結果をフィルターして、スケジュールされたDMFの時間間隔を含めます。

USE ROLE dq_tutorial_role;
SELECT *
FROM SNOWFLAKE.ACCOUNT_USAGE.DATA_QUALITY_MONITORING_USAGE_HISTORY
WHERE TRUE
AND START_TIME >= CURRENT_TIMESTAMP - INTERVAL '3 days'
LIMIT 100;
Copy

クリーンアップ、まとめ、追加リソース

おめでとうございます。このチュートリアルは終了です。

数分かけて、短い要約とこのチュートリアルで説明されている重要な点を確認します。

このチュートリアルで作成したオブジェクトをすべて削除して、クリーンアップすることを検討してください。詳細は、Snowflakeドキュメントの他のトピックをご参照ください。

概要と重要なポイント

まとめると、以下のことを学びました。

  • カスタムDMFを作成してデータ品質を測定し、DMFを管理してサーバーレスクレジット使用状況を最適化します。

  • スケジュールされたDMFの呼び出しに関連するサーバーレスのクレジット使用状況を監視します。

チュートリアルのオブジェクトをドロップする

チュートリアルを繰り返す予定がある場合は、作成したオブジェクトを保持することができます。

そうでない場合は、以下のようにチュートリアルのオブジェクトをドロップします。

USE ROLE ACCOUNTADMIN;
DROP DATABASE dq_tutorial_db;
DROP WAREHOUSE dq_tutorial_wh;
DROP ROLE dq_tutorial_role;
Copy

次の内容

次のリソースを使用して、Snowflakeについて引き続き学習しましょう。