[レポート]ハンズオン/Looker APIでデータディクショナリーを作る – Looker:JOIN 2019 at San Francisco #looker #JOINdata

とある分析の情報目録
2019.11.29

現地時間2019年11月05日〜07日の期間、米国サンフランシスコで開催されているLookerの年次カンファレンスイベント『JOIN 2019』。今年2019年のイベントは、弊社から3名のメンバーが現地参戦しました。

参加レポート各種については下記シリーズをご参照ください。

当エントリでは、その中から『Amplify, Looker, and the Central Source of Truth (Looker APIでデータディクショナリーを作る)』の内容について参加レポートをお届けします。

目次

 

セッション概要

セッションの概要は以下の通りです。

[登壇者情報]:
Samuel Crane氏(Amplify社 Director, Data Science)
Leigha Jarett氏(Looker社 SE)

[セッション情報]:
Amplify, Looker, and the Central Source of Truth
(# Looker APIでデータディクショナリーを作る)

Having a central source of truth for all data descriptions is critical to the development of data literacy within an organization, but data dictionaries are tricky to maintain. Amplify solved this problem by developing a website that uses the Looker API and a custom metadata store to deliver comprehensive, accurate, and up-to-date information about their data. Join us to learn more about the Amplify solution, get hands-on with the Looker API, and start building your own central source of truth.
(すべてのデータに関する一元化された情報源を持つことは、組織内でのデータリテラシーの開発に不可欠ですが、データディクショナリーを維持するのは困難です。Amplify社は、Looker APIとカスタムメタデータストアを使用して、データに関する包括的で正確、最新の情報を提供するWebサイトを開発することで、この問題を解決しました。Amplify社のソリューションの詳細、Looker APIの実践、そして独自の「Central Source of Truth」の構築にご参加ください。)

 

セッションレポート

 

なぜデータディクショナリーが必要なのか

データリテラシーの醸成は、多くの組織にとって課題です。データへのアクセスを提供するだけでは十分ではありません。ユーザーが見ているものをより深く掘り下げるためには、(データに関する)コンテキスト情報が必要です。

Amplify社は、このニーズを満たすためのガイドとしてLookerと一緒に呼び出せる、データに関する専用ウェブサイトを作成しました。そのWebサイトは、APIと基礎となるメタデータストアを介し、Lookerと統合することで、常に最新の状態を維持し、ユーザーがデータリテラシーを構築するための堅牢なリソースを提供するものです。

Looker APIを使って、ビジネスユーザーと技術者の両方からの難しい質問に答えるデータドキュメンテーション(データディクショナリー)を作成することができます。  

Looker APIとは

Looker APIは、Lookerインスタンスを管理し、Lookerデータプラットフォームを介してデータを取得するためのセキュアな「RESTful」APIです。

  • ユーザーの管理
  • コンテンツの作成と実行
  • データサイエンスワークフローのデータを取得
  • スケジュールの自動化
  • プレキャッシュレポート
  • その他いろいろ  

ハンズオンをやってみた

今回は、予めLooker社が用意してくれている、Google Colaboratory環境に置いてあるPythonスクリプトを使用します。

field_metadataテーブルの作成

まず、Model内の各フィールド(ディメンション、メジャー)のメタデータを含むfield_metadataテーブルを作成し、このテーブルをLooker内で使用されるデータベースに書き戻します。

ノートブックを開きます(自分の環境にコピーして使用する)。

下記を実行して、必要なパッケージをインポートします。

import pandas as pd
import requests from requests.packages.urllib3.exceptions 
import json
import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

APIコールを容易にするために、LookerAPIクラスといくつかのヘルパー関数を作成します。これで、コールするたびにHTTPリクエストを行う代わりに、Python関数を使用することができます。

下記は例です。

def get_model(self,model_name="",fields={}):
    url = '{}{}/{}'.format(self.host,'lookml_models', model_name)
    print(url)
    params = fields
    r = self.session.get(url,params=params)
    if r.status_code == requests.codes.ok:
        return r.json()

Lookerとのコネクションを確立します。今回のハンズオン環境では既にハンズオン用Lookerの情報が書かれていますが、ここを書き換えることで、後で自分のLooker環境で試すことができますね。

my_host = 'https://myname.looker.com:19999/api/3.1/'
my_secret = 'my_secret'
my_token = 'my_client_id'

looker = LookerApi(host=my_host, token=my_token, secret = my_secret)

Model名をスクリプトに追加します。

model_name = 'your_model_name_here'
model = looker.get_model(model_name)

そのModel内の各Explore内のすべてのディメンションおよびメジャーに関する情報を取得します。取得したデータはデータフレームとして出力します。

field_dict = [] 
for explore_n in model['explores']:
    explore = looker.get_explore(explore_name=explore_n["name"],model_name=model_name)
    dimensions = explore['fields']['dimensions']
    for d in dimensions:
         d['explore'] = explore['label']
         d['explore_name'] = explore['name']
         d['model_name'] = model_name
         d['explore_description’] = explore['description']
    measures = explore['fields']['measures']
    for m in measures:
         m['explore'] = explore['label']
         m['explore_name'] = explore['name’]
         m['model_name'] = model_name
         m['explore_description'] = explore['description']
    field_dict = field_dict+dimensions+measures

実行すると、下記のような形でexploreのデータを取得できます。

上記データをデータフレームにして出力すると下記のような結果となりました。

このデータフレームを、Lookerで使用するデータベースに書き戻せば完了です(今回のハンズオンでは、既にハンズオン用DBにデータを入れてくれているので、この部分は実行しませんでした)。

Lookerでデータディクショナリーダッシュボードを作成

先ほど作成したfield_metadataテーブルを使って、ダッシュボードを作成します。

今回のハンズオンでは、下記のようなViewファイルが定義されていました。自分環境でやる場合でも、上記で作成したテーブルを含んだDBをconnectionに登録してProjectを開始すると思うので、大体似たような形になると思います。

そして、Modelファイルに下記のようにExploreを定義して、field_metadataテーブルだけでExploreを使用できるようにします。

explore: join_field_metadata {
  view_label: "Field Definitions and Metadata"
  description: "Data Dictionary Explore"
}

ModelやExploreを使用すると、エンドユーザーがデータ定義に簡単にアクセスして操作できるダッシュボードを作成できます。

データアクションやカスタムリンクを使うことで、ダッシュボードから直接Exploreへ飛べるようにしたり、作成者に直接メールを送るようにすることもできます。

 

本気を出してデータディクショナリー作ってみた(っていう事例)

ハンズオンの冒頭で紹介があった、Amplify社の事例となります。上記のようなLookerダッシュボードではなく、最新の状態に更新され続けるデータディクショナリーのWebサイトを作ったとのことです。これぞ本気のデータディクショナリー。

本気のデータディクショナリーのキーポイント

  • LookMLに適切な説明を書く
  • LookMLに取り込まれていないビジネスロジックを書き留める
  • これらすべての情報を、ビジネスユーザーが容易にアクセスできる一元的な場所に統合する
  • ドキュメントを最新の状態に保つには、Looker APIを使用する

Amplify社のデータディクショナリーサイト

TOMLという設定ファイルでメタデータストアを構築、Githubで管理されているとのことです。

このWebサイトのデプロイ体制は下記のようになっているとのことです。LookMLとTOMLからデータ(データディクショナリーの元になるデータ)をもってきてRMarkdownでコンテンツを作成、HUGOという静的サイトを高速で生成できるツールでS3にデプロイしているみたいです。

 

ハンズオンを受講して

LookerはAPIが豊富なのは知っていたので、そこから「Lookerで使われている・定義されているデータの辞書」を作るってのは、事前に多少想像できました。もちろんこれは非常に便利で、昨今話題のデータカタログなるジャンルの製品を別途導入しなくても、その役割もLookerが担えることになります。

ただ、このハンズオンで驚いたのは、それをそのままWebサイトに載せて、定期的に更新されるようにしたAmplify社の事例でした。データディクショナリーにそこまでやるか??って感じなんですが、Webサイトにしてしまうことで、よりビジネスユーザーが気軽に閲覧できるようにしています。ビジネスユーザーからの「こういうデータある?」っていう質問が、全部このサイトで済むようになっているので、本来やりたいことである「データ分析」そのものが、より加速し、ひいてはビジネスそのものを良くしているのではないかと思いました。