---
title: 【Snowflake】テーブルのカラム値の状態や整合性を監視できる「データメトリック関数」を試してみました
description: Snowflakeのデータ品質監視機能「DMF」の使い方やメリットを解説。テーブルの状態や整合性を継続的に監視して高品質なデータを維持しましょう。
---

[Snowflake Knowledge - INSIGHT LAB](https://knowledge.insight-lab.co.jp/snowflake)

# [【Snowflake】テーブルのカラム値の状態や整合性を監視できる「データメトリック関数」を試してみました](https://knowledge.insight-lab.co.jp/snowflake/-data-quality-and-data-metric-functions)

 作成者: [uta](https://knowledge.insight-lab.co.jp/snowflake/author/uta)｜2024年4月08日

## はじめに

本記事では、2024年3月29日のリリースで発表された以下の機能と関数について、実際の使い方や権限付与を含めて紹介します。

- Data Quality Monitoring：データ品質モニタリング

- Data Metric Functions：データメトリック関数

[https://docs.snowflake.com/en/release-notes/2024/other/2024-03-29-dmf](https://docs.snowflake.com/en/release-notes/2024/other/2024-03-29-dmf)

DQMとDMFでできること

- 通常テーブルに対しカラムレベルでデータの状態や整合性を確認することが可能

- あらかじめ用意されたシステム関数かユーザが独自に作成したカスタム関数をクエリで使用

- CRON・TIMING・DML操作をトリガーとして状態を記録し継続的な監視を実現

 

## 環境条件

データ品質機能を利用できるのは、以下の条件を満たすSnowflakeアカウントです。

- Snowflake Enterprise Edition以上
- ACCOUNTADMINが利用できる

 

## Data Quality Monitoring（DQM）とは

データ品質は、新に追加されたSnowflakeの機能です。データ測定関数（DMF）を用いて、データのカラム値の状態や整合性を継続的に監視します。

※sample\_mart\_tableのshop\_nameカラムでの重複を5分ごとに監視している様子

 

一般的なメトリクス（行数・重複・鮮度など）は、Snowflakeが提供するシステムDMFを使用することができ、独自のDMFを作成してビジネス固有のメトリクスを監視することもできます。

また、DMFは通常の関数のようにクエリ内でも使用することができ、テーブルに関連付けることで、CRON・TIMING・DML操作をトリガーとして継続的にモニタリングすることもできます。

料金や制限事項に関する情報はこちら↓  
[https://docs.snowflake.com/en/user-guide/data-quality-intro#billing-and-pricing](https://docs.snowflake.com/en/user-guide/data-quality-intro#billing-and-pricing)

 

## Data Metric Functions（DMF）とは

DMFは、テーブル内のデータに対して、行数・重複・鮮度などのデータの状態や整合性を確認できる新たな関数です。DMFにはあらかじめ用意されたシステムDMFと、ユーザが作成するカスタムDMFの2種類あります。

現時点で存在するシステムUDFは以下の6種類です。

| システムDMF | 用途 |
| --- | --- |
| [FRESHNESS](https://docs.snowflake.com/en/sql-reference/functions/freshness) | カラムデータの鮮度を判定で使用 |
| [DATA\_METRIC\_SCHEDULED\_TIME](https://docs.snowflake.com/en/sql-reference/functions/data_metric_scheduled_time) | カスタム鮮度メトリクスの定義で使用 |
| [NULL\_COUNT](https://docs.snowflake.com/en/sql-reference/functions/null_count) | カラム内のNULL値の数をカウント |
| [DUPLICATE\_COUNT](https://docs.snowflake.com/en/sql-reference/functions/duplicate_count) | NULL値を含むカラム内の重複数をカウント |
| [UNIQUE\_COUNT](https://docs.snowflake.com/en/sql-reference/functions/unique_count) | NULL値を除くカラム内のユニーク数をカウント |
| [ROW\_COUNT](https://docs.snowflake.com/en/sql-reference/functions/row_count) | テーブル内の行数を計測 |

[https://docs.snowflake.com/en/user-guide/data-quality-system-dmfs#system-dmfs](https://docs.snowflake.com/en/user-guide/data-quality-system-dmfs#system-dmfs)

 

システムUDFはSNOWFLAKEデータベースに配置され、デフォルトで使用できるのはACCOUNTADMINロールのみです。他のロールで使用したい場合は、以下のコマンドで権限を付与します。

|   | システムDMF | カスタムDMF |
| --- | --- | --- |
| データベース | SNOWLFLAKE | 任意のデータベース |
| スキーマ | CORE | 任意のスキーマ |

 

1億レコード越えのテーブルの1カラムに対して重複カウントをすると、約10秒ほどで結果が返ってきました。（リザルトキャッシュ有だと約340ms）

※SNOWFLAKE\_SAMPLE\_DATA.TPCH\_SF100.ORDERSのO\_ORDERKEYを使用

## 利用例

 

### 0. 事前準備

架空の日別店舗別の売上集計テーブルを作成します。

- 店舗名にNULLのレコードが1つある
- 店舗名に小文字が含まれているレコードが2つある

> create or replace table sample\_mart\_table (sale\_date date, shop\_name varchar, total\_amount number);  
> insert into sample\_mart\_table (sale\_date, shop\_name, total\_amount)  
> values('2024-04-01', 'SHOP\_HOKKAIDO', 5233)  
> ,('2024-04-01', 'SHOP\_OSAKA', 4581)  
> ,('2024-04-01', 'SHOP\_OKINAWA', 4433)  
> ,('2024-04-01', 'SHOP\_TOKYo', 4342)  
> ,('2024-04-01', 'SHOP\_GuNMA', 5029)  
> ,('2024-04-01', 'SHOP\_NAGOYA', 3333)  
> ,('2024-04-01', 'SHOP\_OKINAWA', 4433)  
> ,('2024-04-01', null, 2980)

 

 

 

### 1. システムDMFの実行

まず、ACCOUNTADMIN以外の任意のロールでDMFを使用するため権限を付与します。

> USE ROLE ACCOUNTADMIN;  
> GRANT IMPORTED PRIVILEGES ON DATABASE SNOWFLAKE TO ROLE {任意のロール};

null\_count関数を使用し、集計テーブル内のSHOP\_NAMEでNULLとなっているレコードが何件あるか確認します。

> select snowflake.core.null\_count(  
> 　　select shop\_name  
> 　　from sample\_mart\_table  
> ) as null\_count;

結果を確認すると、集計テーブルの中にSHOP\_NAMEがNULLとなっているレコードが合計で1件あることが分かります。

 

### 2. カスタムDMFの作成と実行

続いて、独自のDMFを作成しSHOP\_NAMEに小文字が含まれているデータが何件あるか確認します。

> create data metric function lowercase\_count(  
>     arg\_t TABLE(arg\_c varchar)  
> )  
> returns number  
> comment = '小文字が含まれるカラム値をカウント'  
> as  
> $$  
>     select  
>         count(\*)  
>     from  
>         arg\_t  
>     where  
>         0 < length(regexp\_replace(arg\_c, '\[^a-z\]', ''))  
> $$

 

実行するとSHOP\_NAMEに小文字が含まれているレコードが2件あることが分かります。

> select lowercase\_count(select shop\_name from sample\_mart\_table) as lower\_count

 

| ⚠️ 関数の引数とテストするクエリのデータ型やカラム数は一致させてください もし、いくつかのデータ型のカラムに対してカスタムDMFを実行したい場合は、データ型ごとにカスタムDMFを作成しておかなければいけません。 例：システムDMFは各関数がデータ型別に用意されています     |
| --- |

### 3. スケジュール設定

DMFをTABLEに設定するには、下記の権限を使用するロールに付与します。

> USE ROLE ACCOUNTADMIN;
> 
> -- DMFのスケジュール実行権限を付与  
> GRANT EXECUTE DATA METRIC FUNCTION ON ACCOUNT TO ROLE {任意のロール};
> 
> -- 監視結果を参照するためデータベースロールを付与  
> GRANT DATABASE ROLE SNOWFLAKE.USAGE\_VIEWER TO ROLE {任意のロール};  
> GRANT DATABASE ROLE SNOWFLAKE.DATA\_METRIC\_USER TO ROLE {任意のロール};  
> GRANT APPLICATION ROLE SNOWFLAKE.DATA\_QUALITY\_MONITORING\_VIEWER TO ROLE {任意のロール};

 

スケジュールの設定は以下の順序に従う必要があります。

- テーブルにデータメトリクススケジュールを設定
- テーブルにメトリクス関数を設定

 

まず、テーブルに対してデータメトリクスケジュールを設定します。

> alter table sample\_mart\_table set  
>     data\_metric\_schedule = '5 minute';

 

スケジュールを設定したテーブルにシステムDMFのduplicate\_countを店舗名を対象に設定します。

> alter table sample\_mart\_table drop data metric function  
>   snowflake.core.duplicate\_count  
>   on (shop\_name);

 

モニタリング状況は、SNOWFLAKE.LOCAL.DATA\_QUALITY\_MONITORING\_RESULTSビューで確認できます。

> select  
>     scheduled\_time, table\_name, argument\_names, metric\_name, value  
> from  
>     snowflake.local.data\_quality\_monitoring\_results  
> where  
>     table\_name = 'SAMPLE\_MART\_TABLE' and metric\_name = 'DUPLICATE\_COUNT';

 

ここでshop\_nameが重複するレコードを追加します。

> insert into sample\_mart\_table values('2024-04-01', 'SHOP\_HOKKAIDO', 5233)

 

5分後の実行で重複が確認され、監視の結果としてVALUEの値が1となります。これを以上としてアラート設定を行うことで継続的な監視体制を整えることができそうです。

> select  
>     scheduled\_time, table\_name, metric\_name, value  
> from  
>     snowflake.local.data\_quality\_monitoring\_results  
> where  
>     table\_name = 'SAMPLE\_MART\_TABLE' and metric\_name = 'DUPLICATE\_COUNT';

 

### 4. スケジュール解除

DMFの設定解除

> alter table sample\_mart\_table drop data metric function  
>   snowflake.core.duplicate\_count  
>   on (shop\_name);

スケジュールの設定解除

> alter table sample\_mart\_table unset data\_metric\_schedule;

 

## おわりに

本記事では、Data Quality Monitoring（DQM）と Data Metric Functions（DMF）について紹介し、実際に利用してみましました。

「dbt test」みたいだなと感じましたが実際に使ってみると、モデル更新時に行われるdbt testと違い、データ更新時以外にも、CRONやTIMINGで監視できるのはDQMの強みだなと思います。

また、DATA\_QUALITY\_MONITORING\_RESULTSの結果に対して、アラート通知設定などを行うことで、予期せぬデータを一早く気づきデータの品質を高品質に維持することができると思います。

 

こういったデータ品質を監視するツールもあると思いますが、Snowflake上で利用できる強力な機能だと思うので、みなさんのSnowflake環境でもぜひ利用してみてください！

[完全な記事を表示](https://knowledge.insight-lab.co.jp/snowflake/-data-quality-and-data-metric-functions)

```json
{
  "@context" : "http://schema.org",
  "@type" : "BlogPosting",
  "author" : {
    "@type" : "Person",
    "name" : "uta"
  },
  "dateModified" : "2024-04-08T08:00:01.356Z",
  "datePublished" : "2024-04-08T08:00:00Z",
  "headline" : "【Snowflake】テーブルのカラム値の状態や整合性を監視できる「データメトリック関数」を試してみました",
  "image" : {
    "@type" : "ImageObject",
    "height" : 1024,
    "url" : "https://download.insight-lab.co.jp/hubfs/Generated%20images/Snowflake%2c%20Database%2c%20Quality.jpeg",
    "width" : 1792
  },
  "mainEntityOfPage" : "https://knowledge.insight-lab.co.jp/snowflake/-data-quality-and-data-metric-functions",
  "publisher" : {
    "@type" : "Organization",
    "logo" : {
      "@type" : "ImageObject",
      "height" : 60,
      "url" : "/hs/hsstatic/content_shared_assets/static-1.4092/img/default-amp-logo.png",
      "width" : 60
    },
    "name" : "snowflakeナレッジ"
  }
}
```