LookMLで値を変換したい?それならcaseはいかが?
はじめに
※本投稿はLooker Advent Calendar 2024 の10日目の記事となります
はじめまして。
偶然業務でLookerに出会い、そこから色々触っているデータエンジニアです。
Lookerについてはまだまだ駆け出しの身ではありますが、少しずつ分かる事が増え、Lookerへの理解が深まってきたと感じています。
今回はそんな初心者がLookerのフィールドパラメータであるcaseを触ってみた話です。
想定読者
- Lookerについて基本概要を知っている
- LookMLを知っている
- LookMLを触ったことがある・実装したことがある
背景・経緯
※情報に関しては架空のものに変更しています。
とある業務でLookerダッシュボードを作成するためにLookMLを書いていた時の事。
データソースとなるテーブルに以下のようなデータがありました。
user_id | user_name | user_div |
---|---|---|
1234 | tanaka_taro | 1 |
5678 | yamada_hanako | 2 |
... | ... | ... |
特に「user_div」カラムは、ユーザーの所属部署を表すもので、数値毎に分類をされている情報で、以下のように分類されていました。
・1→第1部署
・2→第2部署
・3→第3部署
…
テーブルにデータが入っている時点では数値となっていますが、Looker上では部署名として値を表示しなければなりませんでした。
SQLでも実現可能ですが、LookMLでより効率的な記述方法がないか…、検討してみました。
当時はまだLookMLを書き慣れていない状態だったこともあり、公式ドキュメントを色々と漁っていました。
そんな時、フィールドパラメータとcase文に出会いました。
フィールドパラメータとは
caseの紹介の前に、まずはLookMLにおけるフィールドパラメータについて簡単に書いていきます。
GoogleCloudのLooker公式ドキュメントの方も掲載しますので、詳細を知りたい方はそちらをどうぞ。
LookMLのフィールドパラメータとは、LookやExplorerでメジャー・ディメンションの動作を変更するために使用されるパラメータです。
よくある例ですと、 Label
があります。(実はフィールドパラメータであるという事をこの時に知りました)
Label
もフィールドパラメータの1種で、Explorerにおけるフィールド名や値を任意のものに変更します。
このフィールドパラメータをうまく活用することで、Lookerにおける柔軟なデータ探索や分析を可能にすることができます。
caseとは
caseはフィールドパラメータの1種で、条件に基づいて異なる処理・値を返す際に利用されます。
主にディメンション・メジャーの定義内で利用されています。
書き方
基本的な書き方は以下になります
SQLにおけるcaseと同じように when
を使って条件分岐を行います。
そして when
内に条件に合致した場合の処理を記載します。
【記載例】
dimension: status {
case: {
when: {
sql: ${TABLE}.status = 0 ;;
label: "pending"
}
when: {
sql: ${TABLE}.status = 1 ;;
label: "complete"
}
when: {
sql: ${TABLE}.status = 2 ;;
label: "returned"
}
else: "unknown"
}
}
※記載例では、statusカラムの数値が特定の数値だった場合、任意の値(pending
, complete
, returned
, unkown
)を返すようになっています。
試しに使ってみる
今回は例として以下のようなデータが入っているテーブルをBigQueryに用意します。
(少々雑ですが、「お店の商品一覧とそのストック」という感じで見ていただければ幸いです)
「item_group」は商品の分類を表しており、以下のような名前で分けられます。
- 1: 果物
- 2: 野菜
- 3: 魚介
この「item_group」をcaseを使って数字から文字に表示を変更します。
まずはビューファイル作成とExplorerの設定のみをおこなった状態です。
この状態では「item_group」はまだ数値です。
次にLookMLにcaseを書いていきます。
【LookMLコード】
※ 該当箇所のみ記載しています
view: looker_case_test {
sql_table_name: `{project_id}.{dataset_name}.looker_case_test` ;;
dimension: item_group {
case: {
when: {sql: ${TABLE}.item_group = 1;;
label: "果物"
}
when: {sql: ${TABLE}.item_group = 2;;
label: "野菜"
}
when: {sql: ${TABLE}.item_group = 3;;
label: "魚介"
}
}
}
dimension: item_name {
type: string
sql: ${TABLE}.item_name ;;
}
***
}
上記のようにcaseを追加した結果が以下になります。
データソースでは「1
,2
,3
」となっていた値が「果物
、野菜
、魚介
」に変更されました。
TIPS:表示順について
また、caseにはちょっとした要素があります。
それは、「定義した順に値が並び替えられる」というものです。
Typically, case values appear in the order you write them.
日本語訳) 通常、case値は書き込んだ順に表示されます。
先程の商品ストックのテーブルを例にすると、ソートをかけた場合、値はitem_groupの値の順番で並び替えられます。
(画像では果物、野菜、魚介の順番で並び替えがされます)
これを、LookMLで以下のように順番を変更します。
dimension: item_group {
case: {
when: {sql: ${TABLE}.item_group = 3;;
label: "魚介"
}
when: {sql: ${TABLE}.item_group = 1;;
label: "果物"
}
when: {sql: ${TABLE}.item_group = 2;;
label: "野菜"
}
}
}
すると、「魚介、果物、野菜」の順番にソートされるようになりました。
まとめ・感想
「SQLでいうcase文をLookMLで出来るのか…」と思って探してみた際に出会いました。SQLのcaseとほぼ一緒なので書き方もあまり難しさは感じずサクッと実装できてよかったです。
また、表示の順番については「定義した順に値が並び替えられる」という仕様で、これには少し驚きました。
(よく「この順番で表示できませんか」という依頼も受ける事があるので、このような「できたら嬉しい」という要素があるのは嬉しいと感じています)
2024年はLookerと関わる事が多く、機能や実装面で悩むことがありましたが、その分様々な学びや独特の面白さを知ることができたと感じています。
とはいえ、Lookerについてはまだまだ初心者なので、2025年も引き続き知識を増やしていきたいなと思っています!
Discussion