LookMLはSQLデータベース内のディメンション、集計、計算、およびデータ関係を記述するための言語です。LookerはLookMLで記述されたモデルを使用して、特定のデータベースに対するSQLクエリを作成します。
LookMLプロジェクト
LookMLプロジェクトとは、Gitリポジトリを介してバージョン管理を一括で行うことの多いモデル、ビュー、ダッシュボートのファイルを集めたものです。モデルファイルには、使用するテーブルと結合の方法に関する情報が含まれています。ビューファイルには、各テーブル(あるいは、結合により許可されている場合には複数のテーブル)の情報をどう計算すべきかについての情報が含まれています。
LookMLは構造をコンテンツから切り離します。そのため、クエリの構造(テーブル間の結合様式)はクエリのコンテンツ(アクセスすべき列、派生フィールド、計算すべき集計関数、適用すべきフィルタリング条件式)とは独立しています。
Lookerによって生成されるSQLクエリ
データ分析のために、LookML では DRY 原則(Don't Repeat Yourself)に基づくスタイルを促進しています。つまり、ある箇所に 1 回 SQL 式を書けば、Looker がこのコードを使ってその場に応じた SQL クエリを繰り返し生成していきます。ビジネスユーザーの方々はこの結果、複雑なクエリをLooker内で構築することが可能になります。SQL構文の複雑さに煩わされることなく、必要なコンテンツだけに集中することができます。
次の図は、複数テーブル(Orders Items、Products、およびUsers)の数値を結合する、Lookerで作成されたクエリです。
上の図では、エンドユーザーは結合やフィルタリングを行う上で SQL 式を理解する必要がありません。
データ構造を表現するための従属言語
LookML は make のような依存関係言語で、C や Ruby といった命令型言語とは反対の性質を持ちます。LookMLはデータモデリングのために定義済みのデータタイプと構文を提供します。 LookMLの構文は構造が明瞭で学びやすくなっています。(プログラミング言語の経験は不要です。知っておくべきことはすべてここに記載されています。)LookMLは個々のSQLダイアレクトには依存せず、SQL式をカプセル化してあらゆるSQL実装をサポートします。
コードサンプル
以下の例は、1つのモデルファイルと2つのビューファイルを含む、eコマース店舗向けの最小のLookMLプロジェクトを示しています。
######################################
# FILE: ecommercestore.model.lkml #
# Define the explores and join logic #
######################################
connection: order_database
include: "*.view.lkml"
explore: orders {
join: customers {
sql_on: ${orders.customer_id} = ${customers.id} ;;
}
}
##########################################################
# FILE: orders.view.lkml #
# Define the dimensions and measures for the ORDERS view #
##########################################################
view: orders {
dimension: id {
primary_key: yes
type: number
sql: ${TABLE}.id ;;
}
dimension: customer_id { # field: orders.customer_id
sql: ${TABLE}.customer_id ;;
}
dimension: amount { # field: orders.amount
type: number
value_format: "0.00"
sql: ${TABLE}.amount ;;
}
dimension_group: created { # generates fields:
type: time # orders.created_time, orders.created_date
timeframes: [time, date, week, month] # orders.created_week, orders.created_month
sql: ${TABLE}.created_at ;;
}
measure: count { # field: orders.count
type: count # creates a sql COUNT(*)
drill_fields: [drill_set*] # list of fields to show when someone clicks 'ORDERS Count'
}
measure: total_amount {
type: sum
sql: ${amount} ;;
}
set: drill_set {
fields: [id, created_time, customers.name, amount]
}
}
#############################################################
# FILE: customers.view.lkml #
# Define the dimensions and measures for the CUSTOMERS view #
#############################################################
view: customers {
dimension: id {
primary_key: yes
type: number
sql: ${TABLE}.id ;;
}
dimension: city { # field: customers.city
sql: ${TABLE}.city ;;
}
dimension: state { # field: customers.state
sql: ${TABLE}.state ;;
}
dimension: name {
sql: CONCAT(${TABLE}.firstname, " ", ${TABLE}.lastname) ;;
}
measure: count { # field: customers.count
type: count # creates a sql COUNT(*)
drill_fields: [drill_set*] # fields to show when someone clicks 'CUSTOMERS Count'
}
set: drill_set { # set: customers.drill_set
fields: [id, state, orders.count] # list of fields to show when someone clicks 'CUSTOMERS Count'
}
}
LookMLでは大文字と小文字が区別される
LookMLでは大文字と小文字が区別されるので、LookML要素を参照する場合は大文字と小文字が一致している必要があります。存在しない要素が参照されると、Lookerの警告が出されます。次の例で、デベロッパーは「フライト」を誤って大文字にしています。Looker IDE に、e_FLIGHTS_pdt
が存在しないという警告が表示されます。さらに、IDE は既存の Explore の名前(e_flights_pdt
)を提案します。
プロジェクトに e_FLIGHTS_pdt
と e_flights_pdt
の両方が含まれている場合は、Looker IDE が修正できないため、どのバージョンを使用するかを確認する必要があります。通常、LookMLオブジェクトの名前には小文字を使用することをお勧めします。
また、IDE フォルダ名では大文字と小文字が区別されます。ファイルパスを指定するときは、必ずフォルダ名の大文字と小文字が一致していなければなりません。たとえば、Views
という名前のフォルダがある場合、include
パラメータでも同じ大文字表記を使用する必要があります。繰り返しますが、プロジェクト内の既存のフォルダと大文字/小文字が一致しない場合、Looker IDEはエラーを表示します。
基本となるLookMLの要素の概要
以下の図は、基本的なLookMLの要素とそれらの関係性を示しています。詳細については、LookML の用語とコンセプトをご覧ください。