データ品質問題の修復

データ品質メトリクス(DMFs)を使用すると、テーブル内のどれだけの記録に品質上の問題があるかを特定することができます。例えば、 SNOWFLAKE.CORE.NULL_COUNT は、特定の列に NULL の値を含む記録の数を特定することができます。

これらの可能性のある品質問題を修正するために、 SYSTEM$DATA_METRIC_SCAN システム関数を呼び出して、 DMF によってデータ品質チェックに失敗したデータが含まれていると識別された個々の記録を返すことができます。例えば、 SYSTEM$DATA_METRIC_SCAN 関数に引数として NULL_COUNT DMF を渡すと、 NULL 値を含む記録の数だけでなく、 NULL 値を含む実際の記録を取得することができます。

サポートされた DMFs

SYSTEM$DATA_METRIC_SCAN 関数は、 DMF を引数として受け取り、 DMF によって問題のあるデータを含むと特定された記録を返します。引数として以下のシステム DMFs を使用できます:

  • SNOWFLAKE.CORE.NULL_COUNT

  • SNOWFLAKE.CORE.NULL_PERCENT

  • SNOWFLAKE.CORE.BLANK_COUNT

  • SNOWFLAKE.CORE.BLANK_PERCENT

  • SNOWFLAKE.CORE.DUPLICATE_COUNT

制限と考慮事項

  • SYSTEM$DATA_METRIC_SCAN 関数の引数としてカスタム DMFs を使用することはできません。

  • テーブルがマスキングポリシーや行アクセスポリシーなどのポリシーで保護されている場合、関数を実行したときのユーザーのロールによって結果が異なるため、 SYSTEM$DATA_METRIC_SCAN 関数は予期しないデータや不完全なデータを返すことがあります。

SYSTEM$DATA_METRIC_SCAN 関数の呼び出し

SYSTEM$DATA_METRIC_SCAN 関数を呼び出すと、 DMF を持つテーブルを分析し、データ品質に問題がある可能性を特定します。SYSTEM$DATA_METRIC_SCAN 関数には以下の引数を渡す必要があります: テーブル名、 DMF 、問題のある記録を特定するために DMF に渡される引数。例えば、 SNOWFLAKE.CORE.NULL_COUNT システムメトリック関数が特定の列の NULL 値の総数を返すとすると、以下は、過去の特定の時刻に存在したテーブルのバージョンにおいて、 SSN 列の NULL 値を持つ employeesTable テーブルの行を返します。

SELECT *
  FROM TABLE(SYSTEM$DATA_METRIC_SCAN(
    REF_ENTITY_NAME  => '<governance.sch.employeesTable>'
    ,METRIC_NAME  => '<snowflake.core.null_count>'
    ,ARGUMENT_NAME => '<SSN>'
    ,AT_TIMESTAMP => '<2024-08-28 02:00:00 -0700>'
  ));
Copy

過去のテーブルやビューの DMF 評価結果をチェックするには、 AT_TIMESTAMP 引数を渡します。AT_TIMESTAMP 引数を使うと、 Time Travel を使ってタイムスタンプ文字列をキャストし、「2024-08-28 02:00:00 -0700」のタイムスタンプでテーブルに存在した記録だけを返すことができます。

SYSTEM$DATA_METRIC_SCAN を使ってデータを修正する

SYSTEM$DATA_METRIC_SCAN 関数は、行のセットを返す テーブル関数 です。この関数の出力は、 DML ステートメント内で使用することができ、データ品質チェックに不合格となったデータを含むと特定された記録に対してアクションを起こすことができます。

t テーブルの email 列の空白値を NULL 値で置き換えたいとします。BLANK_COUNT データメトリック関数はブランク値を識別するので、以下のステートメントを実行できます:

UPDATE T
  SET email = null
  WHERE T.ID IN (SELECT ID FROM TABLE(SYSTEM$DATA_METRIC_SCAN(
    REF_ENTITY_NAME => '<t>'
    ,METRIC_NAME => '<snowflake.core.blank_count>'
    ,ARGUMENT_NAME => '<email>'
  )));
Copy