LookML プロジェクト内の各ビューファイルは、Looker 内の単一のビューを定義します。このビューでは、クエリするテーブルと、そのテーブルから Looker UI に表示するフィールド(ディメンションとメジャー)を指定します。ビューは、データベース内の単一のテーブルまたは単一の派生テーブルのいずれかに対応します。
このガイドでは、次のトピックについて学習します。
- LookML ビューファイルの要素と SQL の関係
- 未加工の SQL、組み込みの LookML CASE ロジック、または組み込みの LookML ビンロジックを使用して新しいディメンションを作成する方法
SQL を使用して LookML で派生テーブルを定義してカスタマイズする方法について詳しくは、派生テーブルの SQL コンセプトをご覧ください。
ビュー
以下は、users.view
というビューファイルの例です。このファイルには、クエリ対象のデータベース テーブルの定義と、いくつかのディメンションとメジャーが含まれています。
view: users {
sql_table_name: thelook.users ;;
dimension: id {
primary_key: yes
type: number
sql: ${TABLE}.id ;;
}
dimension: age {
type: number
sql: ${TABLE}.age ;;
}
measure: average_age {
type: average
sql: ${age} ;; }
dimension_group: created {
type: time
timeframes: [raw, time, date, week, month, quarter, year]
sql: ${TABLE}.created_at ;;
}
measure: count {
type: count
}
}
ビュー定義の最初の要素は sql_table_name
パラメータです。これは、ビューでクエリされるデータベース内のテーブルを指定します。ビューへの他のすべての参照ではテーブル エイリアス ${TABLE}
が使用されるため、この値はモデル全体でテーブル名が定義される唯一の場所です。データベース テーブル名を変更する場合は、sql_table_name
パラメータでのみ変更する必要があります。データベース テーブルを参照する際には、いくつかの考慮事項があります。
Looker は sql_table_name
値を使用して SQL FROM 句を記述し、その後にテーブル エイリアスとなるビュー名を記述します。SQL で記述すると次のようになります。
FROM `thelook`.`users` AS `users`
Looker は、ビューで定義されたディメンションとメジャーを使用して SQL SELECT 句を生成します。各ディメンションでは、ディメンションの型(文字列、数値、ブール値など)と、テーブル エイリアスを使用してビュー内のディメンションを参照する sql
LookML パラメータを定義します。age
というディメンションの場合は、次の例をご覧ください。
dimension: age {
type: number
sql: ${TABLE}.age ;;
}
Looker がデータベースに送信する SQL を作成するときに、ビューのエイリアスが ${TABLE}
に置き換えられます。前の例の age
ディメンションの場合、Looker は次のような SELECT 句を生成します。
SELECT `users`.`age` AS `users.age`
メジャーは、多くの場合、ディメンションに対して実行される集計です。ディメンション エイリアスは、指標の sql
式で指定します。たとえば、age
ディメンションの平均を計算する指標には、次の例のように、エイリアス ${age}
を含む sql
式が含まれる場合があります。
dimension: age {
type: number
sql: ${TABLE}.age ;;
}
measure: average_age {
type: average
sql: ${age} ;;
}
age
ディメンションの名前を変更すると、その新しいエイリアスは、そのディメンションのエイリアスの参照に反映されます。
ビューファイルのカスタマイズ
ビューファイルの SQL 式をカスタマイズすることも、Looker の組み込みの LookML ロジックを使用して SQL 式のロジックを模倣することもできます。
SQL 式を使用する
年齢データを 4 つのコホートに分割し、18 歳未満のユーザーを「青少年」、18 ~ 35 歳のユーザーを「若年成人」、36 ~ 65 歳のユーザーを「高齢成人」、65 歳以上のユーザーを「高齢者」と定義するとします。この分割を行うには、これらのコホートをキャプチャする sql
式を使用して、新しいディメンション(dimension: age_cohort
など)を定義する必要があります。次の LookML ディメンション定義では、MySQL データベース接続に適した CASE ステートメントを使用しています。
dimension: age_cohort {
type: string
sql:
CASE
WHEN ${age} < 18 THEN 'Youth'
WHEN ${age} < 35 THEN 'Young Adult'
WHEN ${age} < 65 THEN 'Older Adult'
ELSE 'Senior'
END ;;
}
年齢層をディメンションとして定義したので、年齢層ディメンションを Explore クエリに含めることで、CASE ロジックを再利用できます。
年齢コホート ディメンションを使用して Explore クエリを作成する場合は、Explore の [SQL] タブを使用して Looker が生成した SQL を表示できます。年齢層ディメンションを使用すると、SQL は次のようになります。
SELECT
CASE
WHEN users.age < 18 THEN 'Youth'
WHEN users.age < 35 THEN 'Young Adult'
WHEN users.age < 65 THEN 'Older Adult'
ELSE 'Senior'
END AS `users.age_cohort`,
AVG(`age`) AS `users.average_age`,
COUNT(*) AS `users.count`
FROM
`thelook`.`users` AS `users`
GROUP BY
1
ORDER BY
2 DESC
LIMIT 500
Looker の組み込みケースロジックを使用する
SQL CASE ステートメントと同じ効果を、データベースに依存しない式で実現できます。LookML の case
パラメータを使用すると、sql
式を使用して特定の条件と文字列をキャプチャし、結果にラベルを付ける when
ステートメントで構成されるコホート バケットを定義できます。
次の例は、case
LookML パラメータで書き込まれた同じ新しい age_cohort
ディメンションの例です。
dimension: age_cohort {
case: {
when: {
sql: ${age} < 18 ;;
label: "Youth"
}
when: {
sql: ${age} < 35 ;;
label: "Young Adult"
}
when: {
sql: ${age} < 65 ;;
label: "Middle-aged Adult"
}
else: "Older Adult"
}
}
実行時に、Looker はデータベースに適した SQL CASE 構文を構築します。また、Looker はグループの並べ替えを処理する別の式を構築するため、結果のラベルは英数字で並べ替えられるだけではありません(並べ替え順序を英数字として定義しない限り)。Looker は、次のような SQL クエリを生成します。
SELECT
CASE
WHEN users.age < 18 THEN '0'
WHEN users.age < 35 THEN '1'
WHEN users.age < 65 THEN '2'
ELSE '3'
END AS `users.age_cohort__sort_`,
CASE
WHEN users.age < 18 THEN 'Youth'
WHEN users.age < 35 THEN 'Young Adult'
WHEN users.age < 65 THEN 'Older Adult'
ELSE 'Senior'
END AS `users.age_cohort`,
AVG(`age`) AS `users.average_age`,
COUNT(*) AS `users.count`
FROM
`thelook`.`users` AS `users`
GROUP BY
1,
2
ORDER BY
1
LIMIT 500
Looker の組み込みの bin または tier ロジックを使用する
数値のグループ化方法を指定する別の方法として、Looker の組み込みの bin
または tier
パラメータ型を使用します。type:bin
は bins
パラメータと組み合わせて使用し、type: tier
は tiers
パラメータと組み合わせて使用して、数値ディメンションを一連の数値範囲に分割します。一方で、各ビンにラベルを定義することはできません。
次の LookML の例では、ディメンションで bins
パラメータを使用して、各セットの最小値を定義しています。
dimension: age_cohort {
type: bin
bins: [18,36,65]
style: integer
sql: ${age} ;;
}
ディメンションで tiers
パラメータを使用する方法はまったく同じです。次に例を示します。
dimension: age_cohort {
type: tier
tiers: [18,36,65]
style: integer
sql: ${age} ;;
}
次のような SQL ステートメントが生成されます。
SELECT
CASE
WHEN users.age < 18 THEN '0'
WHEN users.age >= 18 AND users.age < 36 THEN '1'
WHEN users.age >= 36 AND users.age < 65 THEN '2'
WHEN users.age >= 65 THEN '3'
ELSE '4'
END AS `users.age_cohort__sort_`,
CASE
WHEN users.age < 18 THEN 'Below 18'
WHEN users.age >= 18 AND users.age < 36 THEN '18 to 35'
WHEN users.age >= 36 AND users.age < 65 THEN '36 to 64'
WHEN users.age >= 65 THEN '65 or Above'
ELSE 'Undefined'
END AS `users.age_cohort`,
AVG(`age`) AS `users.average_age`,
COUNT(*) AS `users.count`
FROM
`thelook`.`users` AS `users`
GROUP BY
1,
2
ORDER BY
1
LIMIT 500
関連リソース
- 結合の SQL コンセプト
- 派生テーブルの SQL コンセプト
- Looker の SQL 生成ツールを使用する
- How Looker generates SQL(LookerのSQL生成の仕組み)
- Looker クックブック: DRY LookML でコードの再利用性を最大化する