[Looker]PDTをLooker以外から参照できるようにしてみる #looker

2021.02.15

さがらです。

Lookerで複数のテーブルを結合・集計してPDTを生成することがあるかと思いますが、「作ったPDTをLooker以外でも参照できないのかな」と思ったことがある方はいるのではないでしょうか?

そんな方の要望を満たす方法がありますので、本ブログでご紹介したいと思います。

PDTって何だっけ?

ここで改めて、LookerのPDT、略さずに言うと「Persistent Derived Table」とは何かを振り返ります。

かなり端的に言うと、「Looker上で定義したSQLまたはLookMLの内容に基づいて、接続先のDWH・DBに実テーブルを作成する」機能です。

LookerでWINDOW関数を用いたり、注文単位➟店舗単位など別粒度へのデータ変換を行いたいときには派生テーブルを使わないといけませんが、この派生テーブルを実テーブル化させたものがPDTとなります。

より詳しく知りたい方は、下記の公式Docやブログが参考になるかと思います。

PDTをLooker外から参照する時の問題点

前述の通り、PDTは「接続先のDWH・DBに実テーブルを作成する」ため、普通のテーブルとして使用することが可能です。

なのですが、PDTは再生成するたびにテーブル名が変わってしまうという仕様のため、このままPDTを使用しようとすると再生成のたびに参照先のテーブル名の記述を変更しなくてはいけません。

実例を示すと、以下の流れですね。

PDTを作成したあと、「派生テーブルを再作成して実行する」を押してPDTを再作成すると、下図の赤枠内のPDTのテーブル名が変わっていることがわかるかと思います。

PDTをLooker外でも安定して参照させるには

そこで、PDTのテーブル名が変わっても安定して参照できるようにするためにpublish_as_db_viewというパラメータが用意されています。

このパラメータをyesにしていると、対象のPDTを参照するビューを接続先のDWH上に作成してくれます。

それだけでなく、PDTの再生成が行われるたびにビューが参照するPDTのテーブル名を自動で書き換えてくれるため、ユーザーはそのビューを参照すればPDTのテーブル名が変わったことを気にせずにPDTを使用することができる、という機能を持っています。

使い方

使い方としてはとても簡単で、Looker外からも参照したいPDTを定義しているderived_tableパラメータ上で、publish_as_db_view: yesと記述するだけでOKです。

実例

実際にパラメータを適用すると、どうなるのかを確認してみましょう。

下図はBigQueryの例ですが、PDTを格納しているデータセットと同じ所に、ビューが追加されます。

このビューの詳細を見ると、対象のPDTに対してSELECT *を行うクエリが登録されています。

ここでPDTの再生成を行ったとき、ビューのクエリ内容が本当に書き換わっているのかを確認してみます。

下図赤枠のように、ビューのクエリ内容が新しいPDTのテーブル名に書き換わっていることが確認できました。

これで、Looker外からこのPDTを使用したい場合は、このビューを使用すればPDTのテーブル名に左右されず安定して参照できますね!

注意点

PDTを外部参照する際に便利なpublish_as_db_viewですが、2つ注意点があります。

persist_forだけを用いたPDTは対象外

派生テーブルを永続化してPDTとするには、datagroupの適用、sql_trigger_valueの定義、persist_forの定義、という3種類の方法があるのですが、publish_as_db_viewは、persist_forだけで永続化されたPDTには対応していません

公式Docにも、下記のように記載があります。

The publish_as_db_view parameter is supported only for PDTs that use datagroup or sql_trigger_value caching. PDTs using persist_for aren’t supported.

常用するテーブルならば、事前にDWH上で作成することが望ましい

本ブログで紹介しておいて難ですが、常用するテーブルならば、事前にDWH上で作成しておくことがやはり理想的です。

理由としては色々考えはあると思いますが、1つ挙げるならば「PDTは基本的にconnectionで設定した専用のスキーマ(データセット)に格納されるため、一般人が参照しづらい場所にある」ことが挙げられるかと思います。

ただこう聞くと、「じゃあ、いつpublish_as_db_view使うの!」となりかねないですよね…

なので、1つ実際のユースケースを考えてみました。

  1. ユーザーから「このExploreに使用しているデータを他のツールでも使いたいんだけど」と問合せを受ける
  2. publish_as_db_viewyesにしてユーザーに作られたビューを公開する
  3. ユーザーから「このデータいいね!これからも使いたい!」と良い感想を頂いたら、使用しているDWHで適切なスキーマとテーブル名で、テーブル定義する

こういった形で、「Lookerをきっかけとして他のツールでも使用されるデータが生まれる」というユースケースならば、publish_as_db_viewはお手軽に使用できますし、ちょうど良いのではないでしょうか。

最後に

いかがでしたでしょうか!

PDTをより有効活用する上でも、便利な機能かと思います。

ぜひ使用できそうな機会があれば、お試しください。