[Looker]接続先DBのスキーマをLiquidパラメーターで動的に変更する

パラパラ
2020.07.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

奈良県でリモートワーク中の玉井です。

Lookerのparameterを使ったテクニックをご紹介します。

こういう時ありませんか?

配下のテーブル構造が全く同じスキーマが複数ある場面(?)に遭遇したことはありませんでしょうか。

例えば、Snowflakeには最初からTPCHというサンプルデータがあります。

TPCHはDWHのパフォーマンスを測るための有名なサンプルデータです。スキーマが複数ありますが、データ構造がどれも同じです。ただし、データ件数は(スキーマ毎に)異なります。パフォーマンス測定が主目的なので、同じクエリでスキーマだけを変更することで、パフォーマンスを測定しやすいようになっています。

Lookerでこういう構造のデータを参照する時、Explore(またはダッシュボード)から参照スキーマを動的に変更する仕組みにすることができます。Liquidとparameterを使うのですが、実際にやってみました。

やってみた

環境

  • Looker 7.10.14
  • Google Chrome 83.0.4103.116

データについて

前述したSnowflakeのサンプルデータ(TPCH)を使います。

Viewを定義する

いきなりですが、下記のようなViewを定義します。

view: test_d {
  sql_table_name: {% parameter tpch %}."ORDERS" ;;

# dimensionとかは自由に定義する

  parameter: tpch {
    type: unquoted
    allowed_value: {
      label: "TPCH_SF1"
      value: "TPCH_SF1"
    }
    allowed_value: {
      label: "TPCH_SF10"
      value: "TPCH_SF10"
    }
    allowed_value: {
      label: "TPCH_SF100"
      value: "TPCH_SF100"
    }
    allowed_value: {
      label: "TPCH_SF1000"
      value: "TPCH_SF1000"
    }
    allowed_value: {
      label: "TPCH_SF10000"
      value: "TPCH_SF10000"
    }
  }

}

このViewファイルは「ORDER」というテーブルを参照しています。しかし、スキーマ名はLiquid式で動的にしています。では、このスキーマ名に入る文字列は何なのか?というところですが、それが下の方で定義しているtpchというparameterになります。見ればわかる通り、このparameterでは5つの値を定義しています。

これらがどのような仕組みで動くのかは、Exploreを見たほうがわかりやすいので次に行きましょう。

Exploreを開いて確認する

先程作成したViewファイルをそのままExploreとして開きます。

フィールドピッカーにFILTER-ONLY FIELDSという項目が表示されます。Viewの中でparameterやfilterを定義していると、それらはFILTER-ONLY FIELDSという部分に現れます。名前の通りですが、要するに「フィルターのみに使用できる項目」となります。FILTER~という名前ですが、parameterもこちらに該当します。

というわけで、早速、Viewに定義したparameterであるTpchをフィルタに配置します。

配置したフィルタの選択項目はこんな感じです。

parameter内に定義した値が表示されているのがわかりますでしょうか。ここに表示されているのはparameter内のlabelに定義している値になります。

で、とりあえず適当にクエリを実行してみます。

今回は結果はどうでもよくて、見るべきは実際のクエリです。下記のクエリが実行されました。

FROM句に、さり気なくスキーマ名が入っていますね。しかし、このViewファイルのsql_table_nameにスキーマ名は明確に記述していません。そうです、parameterで選択した値がここに入っています

parameter内では下記のように記述されており…

parameter: tpch {
  type: unquoted
  allowed_value: {
    label: "TPCH_SF1"
    value: "TPCH_SF1"
  }
...

このparameterをフィルタとして配置し、「TPCH_SF1」という値を選択しました。実際に使用されるのはlabelに対応したvalueの値です(まあ今回の例ではどちらも同じ文字列なので分かりづらいかもしれませんが…)。

そして、このフィルタ(parameter)で選んだ値が、下記のLiquidに埋め込まれて、クエリが実行されます。

sql_table_name: {% parameter tpch %}."ORDERS" ;;

ですので、parameterを変えると、参照スキーマも変わります。

こんな感じで、Explore上から、LookMLを変えずに、動的に参照スキーマを変更することができました。

おわりに

今回はスキーマを動的にしてみましたが、Liquidとparameterを工夫して使うことで、色々な部分を動的にすることができます。うまく使うと冗長なLookMLを削減することができるので、色々とやってみてください。

参考