什么是 LookML?

LookML 是一种在 SQL 数据库中描述维度、聚合、计算和数据关系的语言。Looker 使用以 LookML 编写的模型针对特定数据库构建 SQL 查询。

LookML 项目

LookML 项目是模型、视图和信息中心文件的集合,通常通过 Git 代码库一起进行版本控制。模型文件包含关于应使用哪些表以及如何将它们联接在一起的信息。视图文件包含有关如何计算每个表的信息(如果联接允许,还可以跨多个表计算信息)。

LookML 将结构与内容分离开来,因此查询结构(表的联接方式)与查询内容(要访问的列、派生字段、要计算的聚合函数以及要应用的过滤表达式)无关。

Looker 生成的 SQL 查询

对于数据分析师,LookML 会培养 DRY 样式(“不要重复自己”),这意味着您在一个位置编写一次 SQL 表达式,并且 Looker 会重复利用代码生成临时 SQL 查询。对企业用户而言,最终就是能够在 Looker 中构建复杂查询,并且仅专注于所需内容,而不是 SQL 结构的复杂性。

下图显示了一个在 Looker 中构建的查询,该查询连接了多个表(订单商品、产品和用户)中的值:

在上图中,最终用户不需要了解 SQL 表达式以进行联接或过滤。

用于描述数据结构的依赖项语言

LookML 是依赖项语言(如 make),而不是 C 或 Ruby 等命令式语言。LookML 为数据建模提供预定义的数据类型和语法。LookML 语法结构清晰且易于学习。(您不需要有编程语言方面的经验,此处包含所有您需要的信息。)LookML 独立于特定的 SQL 方言,并封装 SQL 表达式以支持任何 SQL 实现。

代码示例

以下示例展示了电子商务商店的最小 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 会向您发出提醒。在下面的示例中,开发者错误地将“FlightS”的首字母大写。Looker IDE 会显示一条警告,提示 e_FLIGHTS_pdt 不存在。此外,Android Studio 还会建议现有“探索”的名称,即 e_flights_pdt

不过,如果您的项目同时包含 e_FLIGHTS_pdte_flights_pdt,Looker IDE 将无法更正您的错误,因此您必须确定想要使用的版本。一般而言,在为 LookML 对象命名时继续使用小写。

IDE 文件夹名称也区分大小写。每当您指定文件路径时,都必须匹配文件夹名称的大小写。例如,如果您有一个名为 Views 的文件夹,则必须在 include 参数中使用相同的大小写形式。同样,如果您的大小写与项目中的现有文件夹不匹配,Looker IDE 会提示错误:

基本 LookML 元素概览

下图显示了基本的 LookML 元素及其关系。如需了解详情,请参阅 LookML 术语和概念