【OpenMetadata】Snowflakeの実データのプロファイリング情報をデータカタログに登録する

## ごあいさつ

こんにちは。日鉄ソリューションズ株式会社のhayashitaniです。
私が所属している組織では製造業のお客様向けに、データ基盤構築、データガバナンスコンサルなどを支援させていただいております。

今回は、OSSのデータカタログツール「OpenMetadata」を使って、データカタログにSnowflakeの実データプロファイリング情報（統計情報）を登録してみたいと思います。

　　　　　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/1d75a0da-7dbe-224a-b783-b131b75a31eb.png)

本記事はOpenMetadataの実機操作記事の、３回目の投稿となります。
これまでの投稿については以下のリンクで投稿しています。

| no | 概要 | 
| ------- | ------- | 
| # | データカタログ概要 |
| 1 | [Snowflakeのテクニカルメタデータをデータカタログに取得する](https://qiita.com/hayashi----00/items/29423c5969f6f5b4e94c) |
| 補足 | [Snowflakeの日本語table・view・columnをクローリングしてみる](https://qiita.com/hayashi----00/items/437d1d1967c1745501a5)|
| 2 | [Snowflakeの実データをサンプルとしてデータカタログに登録する](https://qiita.com/hayashi----00/items/0c3ced92ad29a02487f0) |
| 3 | Snowflakeのプロファイリング情報をデータカタログに登録する ★本記事 |
| # | ビジネスメタデータをデータカタログに登録する |
| # | データカタログの検索機能を触ってみる |
| # | リネージをデータカタログに登録する |
| # | Snowflakeの利用情報をデータカタログに登録する |
| # | 用語をデータカタログに登録する |
| # | プロファイリング情報をデータカタログに登録する |
| # | データカタログで品質テストを行う |

:::note warn
本投稿の内容は私個人の意見であり、組織の見解を代表するものではありません。
:::


メタデータの概要については以下に投稿を行っています。
* [【入門】メタデータとは？テーブル定義書の内容を３つのメタデータに分類してみる](https://qiita.com/hayashi----00/items/82015d767b88f75151d9)



## 前提

* OpenMetadataがインストール済み（本記事では、１．６．１バージョンを利用）
* Snowflakeアカウントを利用可能
* **Snowflakeの対象テーブルに1レコード以上データが登録されている**
* ブラウザを利用可能（本記事では、Chromeを利用）
* **OpenMetadata上にSnowflakeの対象テーブルのテクニカルメタデータを取得済み**
:::note alert
テクニカルメタデータの取得によって、データカタログ上にオブジェクトが作成され、そのオブジェクトに対して実データのプロファイリング情報を登録します。
そのため、サンプルデータの登録には、テクニカルメタデータが既にデータカタログ上に存在することが大前提となります。
こちらはOpenMetadataに限らず、ほとんどのデータカタログで同様の仕様です。
:::

## 準備
* ブラウザからOpenMetadataにログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/4e133a20-d878-ab61-8dd6-5b05ae8e5086.png)

対象のテーブルにプロファイリング情報が登録されていないことを確認するため、対象のテーブルのページを開き、「Data Observability」タブ ＞ 「テーブルプロファイリング」タブを表示します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/6881940c-b321-590c-acef-e3393c48ef4d.png)
「Data Observability」タブ ＞ 「カラムプロファイリング」タブを表示します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/52465b5f-7b5f-dd4d-7250-46750cdf6268.png)


未登録なので、黄色の枠内に「Data Profiler is an optional configuration in Ingestion. Please enable the data profiler by following the documentation」と表示されました

## プロファイリング情報取得ジョブ作成
 「設定」＞「サービス」＞「データベース」＞ **対象のデータベースサービス** をクリックして、サービスオブジェクトのページを開き、インジェスチョンタブを参照します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/ce4e0925-cfb5-bb84-4acd-e30a236da1a9.png)

:::note info
インジェスチョンは、情報を取得するためのジョブの名称です。
OpenMetadataでは、用途毎にインジェスチョンの種類が分かれています。
:::

「インジェスチョンを追加」＞「プロファイラインジェスチョン」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/929f4316-1235-17a7-a755-5d3e680c7521.png)

取込設定、スケジュール設定を行い、デプロイします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/b3a98b87-5f53-97a1-b916-3e39b2b75807.png)
（省略）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/52a57eaf-58fa-565c-3f97-54e5b8c5a9f5.png)


以下重要な設定項目です
* 「Compute Metrics」はオンにします
* Viewのプロファイリングを取得する場合は「Include Views」をオンにします
* テーブルのプロファイリングを取得する場合は「Compute Table Metrics」をオンにします
* カラムのプロファイリングを取得する場合は「Compute Column Metrics」をオンにします
:::note warn
「Profile Sample Type」、「Profile Sample」については後日追記します。
:::

:::note info
OpenMetadataのインジェスチョンは**テーブル単位**で**複数**作成することができます。
そのため、重くなりがちなプロファイリング情報の取得を、各テーブルに必要な頻度で設定することができます。
:::

今回は１度ジョブを実行できれば良いので、スケジュール設定は手動実行で指定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/c77249f8-fec7-5b6d-2493-834e9d27c4c9.png)



## 取込ジョブ実行

サービス画面のインジェスチョンタブを開き、対象のジョブを実行します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/a1299742-9d61-439a-cf00-7c5f47db8646.png)

ステータスが「SUCCESS」になったら完了ですが、「FAIL」となりました。
ログボタンをクリックして、エラーとなった理由を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/2a0a3011-7cb5-a157-ca8d-98931bf836da.png)

権限不足でSNOWFLAKE.ACOUNT_USAGE.QUERY_HISTORYビューへのにアクセスに失敗し、エラーとなっていました。（エラーはテーブル毎に出ています。）

取得しようとしているのは、テーブルへのINSERT/UPDATE/DELETE/MERGEのクエリ履歴なので、おそらく以下の画像「Table Updates」、「Volume Changes」グラフの情報を取得しようとして失敗したのではないかと推察します。
エラーの内容から、他の情報は取得できているのではないかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/6882be95-56f2-b467-b573-170790e727a5.png)
（画像の引用元：https://docs.open-metadata.org/latest/how-to-guides/data-quality-observability/profiler/workflow）






## 結果
※インジェスチョンがエラーとなった際の結果です。
### テーブルのプロファイル
対象のテーブルのページを開き、「Data Observability」タブ＞「テーブルプロファイル」タブを表示します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/65e7e1c8-9e0a-6bae-2ca7-b97d9693e7b8.png)
**レコード数、カラムCount、サイズ、作成日などが取得されていました！**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/91aae179-6725-4ac3-de10-c858b832ffcb.png)
**Table Updates、Volume Change以外の結果が取得されていませんでした。** この２つは、SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORYの情報から取得しているようです。

### カラムのプロファイル
対象のテーブルのページを開き、「Data Observability」タブ＞「カラムプロファイル」タブを表示します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/95da794d-714a-b59e-30b8-f68cae6bec2c.png)


こちらも取得できていました！
**カラム名、データ型の横に、NULLの割合、ユニークの割合、DISTINCTの割合、値の数が一覧で表示されてます**

さらに、カラム名をクリックすると、各カラムの詳細を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/97c8ab18-77dd-ead6-9d92-030c5111fc59.png)
(省略)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/a5bf2045-b414-5fad-3f11-1314e8ad64b5.png)
各カラムのプロファイリング情報がグラフやヒストグラムで可視化されます。

### 補足
サンプルデータの取得でも記載しましたが、オブジェクトのページはヘッダーが共通で、タブ毎に表示される情報が変わるようになっています。
テーブルのページでは「スキーマ」タブを選べばテーブル定義、「Data Observability」タブを選べばプロファイリングデータが表示されるので、タブを切り替えるだけで、以下の図のように簡単にテーブル定義とプロファイリングデータを交互に参照することができるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/f4a27d9f-ceb0-88b9-9fc7-5395d56bbeef.png)

そのため、利活用データの探索において、**テーブル定義書（Excelファイル）を見て良さそうであれば、Snowflakeにログインして実データの品質を確認する、という一連の流れが全てデータカタログ上で実施できるようになりました。**

このような使い方をすれば、**苦労して入手したデータがNULLばかりで使えない、といったことを回避できる**のではないでしょうか。

## 追加調査

### 1. エラーの原因を確認する

エラーの内容から、QUERY_HISTORYビューへの権限不足が原因だと思われるので、権限付与を行い、動作確認をします。

まずは、Snowflake上でQUERY_HISTORYビューにアクセスできないことを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/65afd1fa-05b1-4f79-fa73-0a895d370f17.png)

Snowflake上で、対象のロールに権限を付与します
権限については以下のサイトを参考にQUERY_HISTORYビューの参照に必要な権限を付与しました。

:::note info
ORGADMINが有効になっている場合のACCOUNT_USAGEへの権限付与の注意点
https://docs.snowflake.com/ja/sql-reference/account-usage#enabling-the-snowflake-database-usage-for-other-roles
:::

Snowflake上でQUERY_HISTORYビューにアクセスできることを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/6c7dfc3a-6638-0fec-fb02-a9578f92c0ea.png)

再度インジェスチョンを実行します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/a96fa728-5409-55c2-cda6-21fa04b6f428.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/140973f5-0fa7-d359-9413-fe6b306aa209.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/1fe82097-4524-2e8b-ed03-5e612c9642a9.png)

**処理に成功しました！**
エラーの原因はQuery Historyビューへの権限不足だとわかりました


### 2. Table Updates、Volume Changesを取得する条件を考察する
「1. エラーの原因を確認する」にて、処理自体は成功するようになりましたが、対象のテーブルのページ＞「Data Observability」タブ＞「テーブルプロファイル」タブを参照すると以下の画像の通り、Table Updates、Volume Changesのデータは更新されていませんでした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/47a25b2b-9c08-b857-ba9c-6011804ffaa7.png)

エラーログから、QUERY_HISTORYに対して実行しているSQL文を参照します。
SQLの内容からQUERY_HISTORY情報の取得には、少なくとも以下の条件がありそうです。
* QUERY_HISTORYテーブルに記録されている
* QUERY_HISTORYテーブルのクエリタイプがINSERT、DELETE、UPDATE、MERGEのどれか
* QUERY_HISTORYのクエリのステータスが成功になっている
* インジェスチョンの実行日時から24時間以内に実行されている

SNOWFLAKEにて、対象テーブルに、INSERT、DELETE、UPDATE操作を実施します
以下の操作を実施しました
* INSERT：5レコード
* UPDATE：4レコード
* DELETE：10レコード

再びプロファイラインジェスチョンを実行します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/91e62750-c482-3af3-c560-73d69079a717.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/a296e9fb-eafc-9915-91dc-d4b1c7208ebd.png)

処理は成功しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/05c1c82d-0ca0-94fc-ec3e-79b3cf378f99.png)

対象のテーブルのページ＞「Data Observability」タブ＞「テーブルプロファイル」タブを参照します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959879/480a64c0-b49b-3cc6-d2eb-b633d298f5ac.png)

**Table Updates、Volume Changesが登録されました！**

以下の通り、操作したレコード数とも一致しています
* INSERT：5レコード
* UPDATE：4レコード（SQL文が２つに分かれていたので、グラフも分かれています）
* DELETE：10レコード

今回引っかかったTable Updates、Volume Changes登録の条件は「インジェスチョンの実行日時から24時間以内に実行されている」であったことがわかりました。


## 最後に
一部の機能についてはSnowflake上で追加の権限の付与が必要でしたが、テクニカルメタデータを取得済みであったので、プロファイリングデータも簡単に取得することができました。

今回取得したデータプロファイリング情報は、データ利活用の中でも、特にデータ選択やデータクレンジングのプロセスにおいて役立つと考えています。理由は次の通りです。

### データ選択
データ集める際に以下のような事象に直面したことはないでしょうか？？
* 利用したいカラムの値がすべてNULLだった
* 利用したいカラムの値がすべて同じで、有用性がなかった
* 利用したいカラムの値がコード化されており、単体では活用できなかった

こういった場合は、データを取得しても活用することはできません。
しかし、これらの情報は**DBにアクセスしSQLを実行しないとわからないことが多いです。**
そのため、データ取得と確認を繰り返すことで適切なデータを選定するプロセスに時間がかかることが課題となっています。
**データカタログではデータに対する権限が無い場合であっても、データカタログを通じてデータプロファイリング情報としてデータの状態を参照できるので、効率的に最適なデータを選択することができる**と考えています。

### データクレンジング
データクレンジングは、データの状態に応じて適切な処理が必要です。
そのため、**プロファイリング情報に関しては、データを活用する方々が、すでにデータクレンジングに必要な作業やその所要時間を見積もるために個別に収集・活用しているのではないでしょうか。**

また、データクレンジングはデータ利活用において必須のプロセスであり、多くの時間を要することが一般的です。したがって、これらの作業を**一元化し、自動化することで、データクレンジングの手間を少しでも減らし、本来の業務にかける時間を増やすことができる**のではないかと考えています。



以下についてはデータサンプリングと同様なので、本記事では割愛いたします。
* インジェスチョンをテーブル単位で指定できるので、柔軟に情報取得が可能です
* スキーマ情報とプロファイリング情報の切り替えが簡単にできます
[【OpenMetadata】Snowflakeの実データをサンプルとしてデータカタログに登録する](https://qiita.com/hayashi----00/items/0c3ced92ad29a02487f0)



本記事についてご不明点、ご質問事項等があれば、コメントをお願いいたします。
また、本分野に関してご興味を持っていただけた方がいらっしゃれば、お気軽にお問い合わせください。