[新機能]Snowsightで対象のテーブルの品質に関する統計情報を確認できる「Data Quality」タブが追加されました
さがらです。
Snowflakeの新機能として、Snowsightで対象のテーブルの品質に関する統計情報を確認できる「Data Quality」タブが追加されました。
実際に「Data Quality」タブの内容を確認してみたので、本記事で試した内容をまとめてみます。
Data Qualityタブの確認方法
Data Qualityタブですが、各テーブルの詳細を開くと下図のようにData Quality
と表示されていますので、これを押すと見ることができます。
Data Profile
Data Qualityタブには「Data Profile」と「Monitoring」の2種類の画面があるのですが、まずは「Data Profile」から確認してみます。
「Data Profile」では下図のように、各カラムごとにデータ品質に関わる統計情報を確認することができます。(各値やグラフをマウスオーバーしても、表示に変化はありませんでした。)
NULL COUNT
:NULLがあるレコード数NULL
:NULLがあるレコードの割合MIN
:そのカラムの最小値MAX
:そのカラムの最大値TOP VALUES
:そのカラムの中で最も重複している値のうち上位4つを表示
Monitoring
次は、「Monitoring」について確認してみます。
「Monitoring」は、Data Metric Functionsを設定している際に、そのData Metric Functionsの実行状況を確認できる画面となっています。(Data Metric FunctionはEnterpriseエディション以上でないと設定できないため、ご注意ください。)
CustomのData Metric Functionsでも見ることが可能です。(Customは一定数を超えるとドロップダウンのリストで選択する必要があります。)
QUALITY CHECKSについては、2025年8月にリリースされたExpectationを設定していると見ることができます。Expectationについてはこちらの記事が参考になります。
各Data Metric Functionsをクリックすると、下図のようにこれまでに実行されたData Metric Functionsの履歴が確認可能です。
参考:今回設定したData Metric Functionsについて
参考までに、以下のクエリを実行してData Metric Functionsを設定しています。
自分が1つハマった点として、必要な権限の付与前にDMFを作成してテーブルに適用してもDMFの実行が行われず、その後に必要な権限を付与してもDMFが動きませんでした。解決策として、一度テーブルから全てのDMFの設定をDROPして再度ADDしないとDMFが実行されませんでした。 この記事をご覧の皆様はご注意ください…
-- テーブルの所有者であるロールに対してDMF実行に必要な権限を付与(参考:https://docs.snowflake.com/en/user-guide/tutorials/data-quality-tutorial-start#use-dmf-to-return-failed-records)
USE ROLE ACCOUNTADMIN;
GRANT EXECUTE DATA METRIC FUNCTION ON ACCOUNT TO ROLE SAGARA_ADMIN_ROLE;
GRANT APPLICATION ROLE SNOWFLAKE.DATA_QUALITY_MONITORING_VIEWER TO ROLE SAGARA_ADMIN_ROLE;
GRANT DATABASE ROLE SNOWFLAKE.USAGE_VIEWER TO ROLE SAGARA_ADMIN_ROLE;
GRANT DATABASE ROLE SNOWFLAKE.DATA_METRIC_USER TO ROLE SAGARA_ADMIN_ROLE;
-- 適切なロールとコンテキストを設定
USE ROLE SAGARA_ADMIN_ROLE;
USE SCHEMA SAGARA_RAWDATA_DB_CLONE.CITIBIKE;
-- 1. 不正なTRIPDURATIONをカウント
CREATE OR REPLACE DATA METRIC FUNCTION invalid_trip_duration_count(arg_t TABLE(tripduration NUMBER))
RETURNS NUMBER AS 'SELECT COUNT(*) FROM arg_t WHERE tripduration < 60';
-- 2. 非現実的なBIRTH_YEARをカウント
CREATE OR REPLACE DATA METRIC FUNCTION unreasonable_birth_year_count(arg_t TABLE(birth_year NUMBER))
RETURNS NUMBER AS 'SELECT COUNT(*) FROM arg_t WHERE birth_year IS NOT NULL AND birth_year < 1900';
-- 3. 不正なGENDERコードをカウント
CREATE OR REPLACE DATA METRIC FUNCTION invalid_gender_code_count(arg_t TABLE(gender NUMBER))
RETURNS NUMBER AS 'SELECT COUNT(*) FROM arg_t WHERE gender NOT IN (0, 1, 2)';
-- 4. STOPTIMEがSTARTTIME以前になっているレコードをカウント
CREATE OR REPLACE DATA METRIC FUNCTION trip_time_logic_errors(arg_t TABLE(starttime TIMESTAMP, stoptime TIMESTAMP))
RETURNS NUMBER AS 'SELECT COUNT(*) FROM arg_t WHERE stoptime <= starttime';
-- 5. TRIPDURATIONと実際の時間差が5秒以上ずれているレコードをカウント
CREATE OR REPLACE DATA METRIC FUNCTION trip_duration_mismatch(arg_t TABLE(starttime TIMESTAMP, stoptime TIMESTAMP, tripduration NUMBER))
RETURNS NUMBER AS 'SELECT COUNT(*) FROM arg_t WHERE ABS(DATEDIFF(''second'', starttime, stoptime) - tripduration) > 5';
-- 6. START_STATIONの緯度がニューヨーク市の範囲外であるレコードをカウント
CREATE OR REPLACE DATA METRIC FUNCTION invalid_start_latitude(arg_t TABLE(lat FLOAT))
RETURNS NUMBER AS 'SELECT COUNT(*) FROM arg_t WHERE lat NOT BETWEEN 40.5 AND 40.9';
-- 7. USERTYPEが想定外の値であるレコードをカウント
CREATE OR REPLACE DATA METRIC FUNCTION invalid_usertype_count(arg_t TABLE(usertype VARCHAR))
RETURNS NUMBER AS 'SELECT COUNT(*) FROM arg_t WHERE usertype NOT IN (''Subscriber'', ''Customer'') AND usertype IS NOT NULL';
-- テーブルに実行スケジュールを設定
ALTER TABLE SAGARA_RAWDATA_DB_CLONE.CITIBIKE.TRIPS SET DATA_METRIC_SCHEDULE = '5 MINUTE';
-- システムDMFを適用
ALTER TABLE SAGARA_RAWDATA_DB_CLONE.CITIBIKE.TRIPS ADD DATA METRIC FUNCTION SNOWFLAKE.CORE.NULL_COUNT ON (BIRTH_YEAR)
EXPECTATION expect_nulls_below_threshold (VALUE < 7000000);
ALTER TABLE SAGARA_RAWDATA_DB_CLONE.CITIBIKE.TRIPS ADD DATA METRIC FUNCTION SNOWFLAKE.CORE.DUPLICATE_COUNT ON (BIKEID)
EXPECTATION expect_zero_duplicates (VALUE = 0);
-- カスタムDMFを適用
ALTER TABLE SAGARA_RAWDATA_DB_CLONE.CITIBIKE.TRIPS ADD DATA METRIC FUNCTION invalid_trip_duration_count ON (TRIPDURATION)
EXPECTATION expect_zero_invalid_durations (VALUE = 0);
ALTER TABLE SAGARA_RAWDATA_DB_CLONE.CITIBIKE.TRIPS ADD DATA METRIC FUNCTION unreasonable_birth_year_count ON (BIRTH_YEAR)
EXPECTATION expect_zero_unreasonable_birth_years (VALUE = 0);
ALTER TABLE SAGARA_RAWDATA_DB_CLONE.CITIBIKE.TRIPS ADD DATA METRIC FUNCTION invalid_gender_code_count ON (GENDER)
EXPECTATION expect_zero_invalid_genders (VALUE = 0);
ALTER TABLE SAGARA_RAWDATA_DB_CLONE.CITIBIKE.TRIPS ADD DATA METRIC FUNCTION trip_time_logic_errors ON (STARTTIME, STOPTIME)
EXPECTATION expect_zero_time_errors (VALUE = 0);
ALTER TABLE SAGARA_RAWDATA_DB_CLONE.CITIBIKE.TRIPS ADD DATA METRIC FUNCTION trip_duration_mismatch ON (STARTTIME, STOPTIME, TRIPDURATION)
EXPECTATION expect_zero_duration_mismatch (VALUE = 0);
ALTER TABLE SAGARA_RAWDATA_DB_CLONE.CITIBIKE.TRIPS ADD DATA METRIC FUNCTION invalid_start_latitude ON (START_STATION_LATITUDE)
EXPECTATION expect_valid_latitude (VALUE = 0);
ALTER TABLE SAGARA_RAWDATA_DB_CLONE.CITIBIKE.TRIPS ADD DATA METRIC FUNCTION invalid_usertype_count ON (USERTYPE)
EXPECTATION expect_valid_usertypes (VALUE = 0);
-- テーブルに設定したDMFの確認
SELECT * FROM TABLE(INFORMATION_SCHEMA.DATA_METRIC_FUNCTION_REFERENCES(
REF_ENTITY_NAME => 'SAGARA_RAWDATA_DB_CLONE.CITIBIKE.TRIPS',
REF_ENTITY_DOMAIN => 'TABLE'));
-- DMFの結果の確認
SELECT scheduled_time, measurement_time, table_name, metric_name, value
FROM SNOWFLAKE.LOCAL.DATA_QUALITY_MONITORING_RESULTS
LIMIT 100;
最後に
Snowsightで対象のテーブルの品質に関する統計情報を確認できる「Data Quality」タブが追加されたので、試した内容をまとめてみました。
Snowflakeだけでここまでデータ品質のモニタリングができるのは凄いですね!Expectationと合わせることで異常が見られる場合にはSnowsight上で確認もできます。
ぜひご活用ください!