データベース技術調査ブログ

LinuxやPostgreSQL、Oracleデータベース、AWSの知識をアウトプットしていきます

【Great Expectations】データ品質・プロファイリング・ドキュメントのためのOSSに大きな期待

最近dbtについて情報を収集していたら、Great ExpectationsというOSSと合わせて使っているという事例があり、これは何者?という疑問が湧いたのでちょっと調べてさわり程度に動かしてみました。

https://greatexpectations.io/

GitHub - great-expectations/great_expectations: Always know what to expect from your data.


Great Expectationsとは

データ分析基盤におけるテストの考え方はいくつかありますが、データ基盤構築時のテストと運用における継続的なデータ品質を保つためのテストの2種類に大別してみます。Great Expectationsは後者の運用中のデータ品質を保つためのテストを効率的に実施していくためのフレームワークと言えます。
(以下GEと略したりすることもあります。)

調べてみるとGEは大きく3つの機能に分類できそうでした。

1) Expectation: データ品質の定義(とテストの実行=Validation)

根幹をなす機能で、このデータはこうあるべきということ(データ品質)を定義してチェック(テスト)する(=Validation)という機能です。
データ品質管理における各種課題を対応できるように柔軟に拡張できるようになっているそうです。
いくつか代表的な定義はインターフェースが用意されているので、それに従って設定すれば良さそうです。

CheckpointというまとまりにそれぞれのExpectationsを紐づけて管理する機能と組み合わせて運用していくようです。


2) Tests are docs and docs are tests: データのテストのドキュメンテーション

Expectationで定義した姿になっているかテストを実行してそれを読みやすいドキュメントとしてレポートしてくれます。
データ品質のドキュメントなんて工数かけるのかったるいので自動で生成してくれるのはありがたすぎますね。
ちなみにGitHubのReadmeではベータ版らしいですが、ちょっと触った感じだとちゃんと使えました。


3) Automated data profiling: 自動的なデータプロファイリング

これはまだ実験的な機能ですが、めっちゃ強力な機能です。なんと自動的にデータのプロファイリングをした結果をもとにExpectationを定義してくれるという機能のようです。
ドキュメント生成の機能と組み合わせれば、このデータはこんな感じだよというのをドキュメントとして自動的に生成可能してくれるという機能になる予定だそうです。

最後は人の手でExpectationを手直ししてあげる必要はありますが、少なくともゼロから全てやろうとするとしんどいので、テストを書くのが楽になるだけで嬉しいです。

そもそもテストはどうでもよく、データの傾向をドキュメントとして生成されるだけで最高の機能といえます。

この機能がちゃんと動くようになれば、データ活用業界で覇権取るようなOSSになると思います。


ちなみにちょっと触ったくらいだと初期化のタイミングで指定したテーブルの一部のプロファイリング結果をExpectationとしてサンプルとして生成してくれたので、多分この機能が強化されて利用できるようになるんだと予想しています。(ドキュメント読んだんですがよく分からなかった…orz)


メインの機能は上の3つですが、その他に以下の特徴があります。

4) Batteries-included data validation: 本番環境での運用を意識した機能

こちらはちょっと触った範囲では見れていないのであまりわからないです。ざっと調べた限りこんな感じの様です。

Chackpointに集約してのValidationの実行
・データソースの認証情報AWSのSecret Managerなどから取得する機能
Expectation(データ品質の定義ファイル)をS3などにストアする機能(開発はローカルのファイルシステムを使用したりする)
Bashスクリプトでの呼び出しだけでなくPythonスクリプトの呼び出しでも可能(Airflowとの連携)
Flyteとの連携(コンテナネイティブにできたりしそう)

…などなど他にもありそう


5) Pluggable and extensible: OSSならではの柔軟な機能追加

プラグインが可能な作りにしているので、いろいろな機能が柔軟に追加されているようです。


initくらいまでお試し動作確認

コンテナでGreat Expectationsを動かしてみましょう。
私の場合は対象のDBをPostgreSQLにしてコンテナで起動しています。(dbtの検証で利用しているデータが入っています。)

こんな感じでDockerfileを書いて動かしてみます(今回はPostgreSQLに対していろいろいじるためのパッケージを一緒に入れています)
SQLalchemyを利用して多くのRDBMSをサポートするようにしているようなので、忘れずに入れるようにしましょう。

FROM python:3.9-slim

# Update and install system packages
RUN apt-get update -y && \
    apt-get install --no-install-recommends -y -q \
    git libpq-dev python3-dev build-essential && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# Install GE & PostgreSQL required package
RUN pip install --upgrade pip && \
    pip install great_expectations && \
    pip install sqlalchemy psycopg2

# Set environment variables
ENV PYTHONIOENCODING=utf-8
ENV LANG C.UTF-8

# Set WORKDIR and VOLUME
WORKDIR /usr/app
VOLUME /usr/app

(私の環境ではVSCodeのRemote Containerを開いてみましたが、正直Jupyterが開けるので普通にDocker起動すればいいです)
開けるポートは8888です。(Jupyter Notebookのポート)



コンテナを起動した後はディレクトリを切って、プロジェクトを初期化してみましょう。

# バージョンの確認(2021/10/16時点で0.13.38でした)
great_expectations --version

# プロジェクトのディレクトリを作成
mkdir data_quality
ls -l

# 初期化する(直前に作成したディレクトリを指定)
great_expectations init -d data_quality

initを実行すると対話型のプロンプトが出てくるので、表示に従っていろいろ設定していきます。

①Validation対象のデータソースの設定
②試しに1つのデータプロファイルとExpectationのサンプルの生成
③ドキュメント(Data Docs)の生成


ドキュメントのHTMLファイル(index.html)のパスが表示されるのでブラウザで開くとドキュメントを確認可能です。


②でできたプロフェイルをJuypter Notebookで編集する場合はコンテナは何もしないとrootユーザで実行されるのでJupyter Notebookをrootで開くという特殊技をするか、別のユーザを作るかなどをする必要があります。(参考の手順をみてください。)

# プロジェクトのディレクトリへ移動
cd data_quality

# Suiteのリストを表示
great_expectations suite list

# Jupyter notebookを開いて編集する
great_expectations suite edit <Suite名>


【参考】
rootでJupyterを実行するための設定

# 設定ファイルを生成
jupyter notebook --generate-config

以下のcNotebookApp.allow_rootを書き換えます。(最初コメントアウトされているので追記するのでOK)

## Whether to allow the user to run the notebook as root.
#  Default: False
c.NotebookApp.allow_root = True

最後に

このinitの動作確認で力尽きたので、今後データプロファイリングの機能充実などを追っていきながらもう少し具体的な検証をしてみようともいます。


将来的にデータ活用基盤の技術スタックに欠かせないような存在になりそうなGreat Expectationsに大きな期待をしています(*´▽`*)