LookML 优化

这是一个高级主题,假定读者具备充分的 LookML 知识。

概览

借助 LookML 优化,您可以调整现有的视图探索,而无需修改包含该视图的 LookML 文件。这非常适合:

例如,如果您的项目中具有以下视图文件:

view: flights {
  sql_table_name: flightstats.accidents ;;

  dimension: id {
    label: "id"
    primary_key: yes
    type: number
    sql: ${TABLE}.id ;;
  }
}

您可以优化 flights 视图,如下所示:使用具有相同视图名称的 view 参数,但要在名称前面添加一个加号 (+),以表明它是现有视图的优化条件。

此优化会将 air_carrier 维度添加到现有的 flights 视图中:

view: +flights {
  dimension: air_carrier {
    type: string
    sql: ${TABLE}.air_carrier ;;
  }
 }

此优化可以传入项目中的任何 LookML 文件,例如模型文件、视图文件或专属的 LookML 文件。如需了解其工作原理,请参阅在 LookML 项目中使用优化部分。

优化后与原始 LookML 相结合,得到最终结果,就好像该视图的原始 LookML 一样:

view: flights {
  sql_table_name: flightstats.accidents ;;

  dimension: id {
    label: "id"
    primary_key: yes
    type: number
    sql: ${TABLE}.id ;;
  }

  dimension: air_carrier {
    type: string
    sql: ${TABLE}.air_carrier ;;
  }
}

在 Looker 界面中,用户会看到“Air Carrier”维度,就好像您已将该维度添加到原始视图文件本身一样。

如需了解更详细的实现信息,请参阅下面的示例

优化与扩展相比

Looker 还支持扩展 LookML 对象。当您想要为现有视图或“探索”创建新的副本以便为其添加新对象时,扩展就很有用。例如,您可以创建一个定义所有字段的基本视图,然后创建多个扩展基本视图的新视图。随后可以修改这些新视图,以隐藏基本视图中的特定字段,或更改基本视图中这些字段的定义或标签。

如果您想修改现有视图或探索,并想调整或调整某些对象,但又不想为相应视图或探索创建副本,优化功能会非常有用。优化是非常适合您无法或不想修改基本视图或探索的情况,适合创建新视图或探索需要对其他 LookML 引用进行大量更改的情况。有关此类用例的示例,请参阅本页面中的示例部分。

对于大多数使用场景,优化是 extends 的更简单、更清洁的替代方案。

高级 LookML 开发者可能需要在 LookML 优化中使用 extends 参数。如需了解详情,请参阅本页面中的优化可以包含扩展部分。

优化可覆盖大多数参数

请务必注意,在大多数情况下,优化会覆盖对象的原始设置。在以下示例中,原始视图具有一个隐藏维度 (hidden: yes):

view: faa_flights {
  dimension: carrier {
    hidden: yes
  }
}

在另一个文件中,使用 hidden: no 对该维度进行了优化:


include: "/views/faa_flights.view.lkml"

view: +faa_flights {
  dimension: carrier {
    hidden: no
  }
}

最后一项优化的优先级更高,因此系统会应用 hidden: no,并在最终视图中显示该维度。

在某些情况下,优化会添加而不是替换;如需了解详情,请参阅本页面的部分参数可添加部分。

部分参数可累加

在许多情况下,如果优化包含与要优化的对象相同的参数,则优化将覆盖优化对象的参数值

但对于某些参数,优化可叠加使用,也就是说,基础对象的值将与优化对象的值结合使用。

以下参数可添加

例如,以下视图的 name 维度包含 link 参数:

view: carriers {
  sql_table_name: flightstats.carriers ;;

  dimension: name {
    sql: ${TABLE}.name ;;
    type: string
    link: {
      label: "Google {{ value }}"
      url: "http://www.google.com/search?q={{ value }}"
      icon_url: "http://google.com/favicon.ico"
    }
  }
}

下面是对 carriers 视图的优化,其 name 维度具有不同的 link 参数值:


include: "/views/carriers.view.lkml"

view: +carriers {
  label: "Refined carriers"

  dimension: name {
    sql: ${TABLE}.name ;;
    type: string
    link: {
      label: "Dashboard for {{ value }}"
      url: "https://docsexamples.dev.looker.com/dashboards/307?Carrier={{ value }}"
      icon_url: "https://www.looker.com/favicon.ico"
    }
  }
}

在经过优化的 carriers 视图中,两个 link 形参是相加的,因此 name 维度会同时包含这两个链接。“探索”中的维度如下所示:

按顺序应用优化条件

对象可以在多个位置进行多次优化,这使得 Looker 开发者能够以多种创造性的方式使用优化。但这也意味着,开发者必须非常谨慎地应用优化顺序:

  • 在项目中,系统会按照文件包含顺序应用优化条件。根据您最后添加的文件过滤条件将会覆盖之前添加的文件过滤条件。
  • 在一个文件中,系统会逐行应用优化。系统会优先应用行数最多的优化条件,如果存在冲突,则会覆盖之前的所有优化条件。

您可以使用 final: yes 标志验证系统是否以您预期的顺序应用优化。如需了解详情,请参阅使用 final: yes 防止进一步优化部分。

例如,以下视图文件中包含 faa_flights 视图的两个优化条件。第一个过滤条件隐藏一个维度 (hidden: yes),第二个优化维度显示该维度 (hidden: no)。如果出现此类冲突,以文件中的最远过滤条件为准:

include: "//e_faa_original/views/faa_flights.view.lkml"

view: +faa_flights {
  dimension: carrier {
    hidden: yes
  }
}

view: +faa_flights {
  dimension: carrier {
    hidden: no
  }
}

此逻辑与在项目中包含多个文件类似:系统会优先添加包含文件中列出的最后一个文件。例如,如果模型文件包含以下文件:

include: "/refinements/distance_analysis.lkml"
include: "/refinements/finishing_touches.lkml"

首先应用 distance_analysis.lkml 中的所有优化,然后应用 finishing_touches.lkml 文件中的所有优化。如果存在冲突,则以最后一个文件中的优化条件(即 finishing_touches.lkml)为准。

优化是按照包含顺序进行的,因此如果您想使用优化,就不应在包含中包含通配符。一般而言,最好避免在数据视图中使用通配符,特别是在项目有大量视图文件项目使用永久性派生表 (PDT) 的情况下。但要特别注意优化,不建议在包含内容中使用通配符。

使用 final: yes 防止进一步优化

如前所述,同一对象可以在多个位置多次优化,而最后一个优化条件覆盖之前的所有优化条件。

如果您想让优化被视为视图或“探索”的最终优化,可以在优化中添加 final: yes 标志。如果存在必须在最终优化后应用的现有优化,或如果开发者尝试添加将在最终优化后应用的新优化,Looker IDE 将返回 LookML 错误。例如,此视图文件中的第二个优化会创建一个 LookML 错误,因为之前的优化具有 final: yes 标志:

include: "//e_faa_original/views/faa_flights.view.lkml"

view: +faa_flights {
  final: yes
  dimension: carrier {
    hidden: yes
  }
}

view: +faa_flights {
  dimension: carrier {
    hidden: no
  }
}

向优化添加 final: yes 标志可有效验证您的优化是否按照您希望的顺序应用。

优化条件可包含扩展项

高级 LookML 开发者可能需要在 LookML 优化中使用 extends 参数,该参数会将扩展对象添加到正在优化的对象中。

总结 extends 的行为和优化:

  • 扩展某个对象会创建一个新对象副本,然后在该对象的基础上进行构建。例如,您可以创建一个定义所有字段的基本视图,然后创建多个扩展基本视图的新视图。每个新视图都包含基本视图的副本,开发者可以在此基础上添加不同的字段、过滤器或其他属性来修改基本视图中的内容。具体做法是,先从基础对象开始,然后在其他对象中以不同方式使用它。(如需查看有关如何使用扩展功能的完整讨论,请参阅通过扩展代码重复使用代码文档页面)。
  • 优化对象会向对象添加一层修改,但与扩展不同,优化不会复制对象的多个副本。该构思基于基础对象进行构建,而无需修改其原始 LookML。

例如,下面是一个名为 orders 的“探索”和用于进行优化的 +orders“探索”:

explore: orders {
  view_name: orders
  # other Explore parameters
}

explore: +orders {
  label: "Orders Information"
  # other Explore parameters to build on the original Explore
}

除此之外,您还可以添加包含 extends 的优化标签。以上面的示例为基础,下面是相同的 orders 探索。除此之外,还有一个名为 users_base 的基本“探索”,现在 +orders 优化添加了一个 extends 参数,用于引入 users_base


explore: users_base {
  view_name: users
  extension: required
  # other Explore parameters
}

explore: orders {
  view_name: orders
  # other Explore parameters
}

explore: +orders {
  label: "Orders Information"
  extends: [users_base]
  # other Explore parameters to build on the original Explore
}

这里的特别之处在于,+orders 优化字段具有 extends。结果是,+orders 视图现在会扩展 users_base Discover。

Looker 如何在优化范围内实现 extends

在优化范围内扩展对象是一个高级 LookML 概念。在优化中使用 extends 之前,您应该对以下内容有深入的了解:

  • Looker 如何实现 extends:如果扩展对象和扩展对象中都定义了 LookML 元素,则使用扩展对象中的版本,除非该参数是添加项。如需了解详情,请参阅通过扩展重复使用代码文档页面。
  • Looker 如何实现优化:如果在多个优化中定义了 LookML 元素,则最后一个优化会覆盖之前的优化。如需了解详情,请参阅本页面中的按顺序应用优化部分。

最后,您应该了解 Looker 如何将这些原则相结合来实现在优化中使用的 extends。以下是 Looker 实现的顺序,每个步骤在发生冲突时会替换前一个步骤:

  1. 对象中指定的 extends 中的值
  2. 对象优化中指定的 extends 的值
  3. 对象中的值
  4. 对象优化结果中的值

为了进行说明,我们在下面提供了实现过程中每个步骤的 label 参数值:

explore: orders_base {
  label: "Orders Base"
  view_name: orders
  extension: required
}

explore: users_base {
  label: "Users Base"
  view_name: users
  extension: required
}

explore: orders {
  label: "Orders"
  extends: [orders_base]
}

explore: +orders {
  label: "Orders Refined"
  extends: [users_base]
}

在本例中,Looker 为 orders Discover 实现了 label 的值:

  1. 对象中指定的 extends 中的值。由于 orders 探索具有 extends 参数,因此 Looker 会从要扩展的对象(在本例中为 orders_base 探索)中的 LookML 元素开始。此时,label 值为“Orders Base”。
  2. 对象优化中指定的 extends 中的值。由于 orders 具有优化条件,而该优化条件具有 extends 参数,因此 Looker 随后会应用优化扩展中的 LookML 元素,在本例中为 users_base 探索。此时,label 值为“Users Base”。
  3. 对象中的值。现在,所有扩展都已解决,Looker 会应用扩展对象(在本例中为 orders 探索)中的元素。如果存在任何冲突,扩展对象将胜出。因此,现在 label 值为“Orders”。
  4. 对象优化值。最后,Looker 会应用 orders 探索的任何优化中的元素。如果存在任何冲突,优化对象将胜出。因此,现在的 label 值是“Orders 细化”。

优化 extends 可累加

正如本页中的优化替换参数部分所述,优化通常覆盖对象的原始设置。extends 参数并非如此。在优化中使用 extends 时,extends 参数的值会附加到原始对象或之前优化中扩展的项目列表(如果有)。然后,如果存在冲突,系统会优先考虑扩展链中的最后一项。

例如,这里有一个名为 orders_base 的基本探索和一个用于扩展基础的 orders 探索。此外,还有 users_base 探索和扩展 users_base+orders 优化项:

explore: orders_base {
  view_name: orders
  extension: required
  # other Explore parameters
}

explore: users_base {
  view_name: users
  extension: required
  # other Explore parameters
}

explore: orders {
  extends: [orders_base]
  # other Explore parameters to build on the base Explore
}

explore: +orders {
  extends: [users_base]
  # other Explore parameters to build on the base Explores
}

orders 探索扩展了 orders_base,然后 +orders 优化将 users_base 添加到了 extends 列表中。结果是,+orders 探索现在将同时扩展 orders_baseusers_base,就好像这是“探索”的原始 LookML:

explore: orders {
  extends: [orders_base, users_base]
}

然后,如果存在冲突,系统会优先考虑扩展链中的最后一项。在此示例中,users_base 中的元素将替换 orders_base 中的任何冲突元素。

重复使用具有扩展的代码文档页面介绍了同时扩展多个对象的概念。

最后要注意的是,在本例中,explore 参数的顺序无关紧要。但如果同一个对象有多个优化条件,优化顺序也很重要。如本页中的应用优化条件部分中所述,文件中的最后一个优化条件会覆盖之前的优化条件。

在 LookML 项目中使用优化

以下是在项目中优化视图和探索的步骤:

  1. 找到您要优化的视图或探索。
  2. 确定优化条件的位置。您可以在任何现有的 LookML 文件中添加优化,也可以为优化创建单独的 LookML 文件。(有关创建通用 LookML 文件的示例,请参阅了解其他项目文件文档页面中的创建数据测试文件的过程。)
  3. 使用 include 参数将优化整合到模型中:
    • 在您写入优化文件的文件中,必须包含要优化的 LookML 文件。如果您尝试优化不包含的对象,Looker IDE 会向您发出警告。
    • 在模型文件中,添加定义了优化的文件。您可以非常有创意地组合使用文件包含内容;如需了解详情,请参阅本页面中的使用优化条件向模型中添加层部分。

示例

优化 LookML 对象可以轻松地调整视图和探索,而无需修改原始 LookML。当您的视图和探索在项目中处于只读状态(例如从其他项目导入的文件)时,此功能会特别有用。以下是优化“探索”的示例。

以下是 aircraft 探索的 LookML:


explore: aircraft {
  join: aircraft_types {
    type: left_outer
    sql_on: ${aircraft.id} = ${aircraft_types.id} ;;
    relationship: many_to_one
  }

  join: aircraft_engine_types {
    type: left_outer
    sql_on: ${aircraft.id} = ${aircraft_engine_types.id} ;;
    relationship: many_to_one
  }
}

此“探索”包含多个视图,每个视图都有多个维度。

现在,另一个名为 e_faa_refined 的 LookML 项目导入了 aircraft 探索文件。在 e_faa_refined 项目中,您可以使用优化来大幅简化 aircraft 探索。

由于“aircraft”探索是导入的文件,您无法直接修改。不过,您可以向其中添加优化标签。下面是包含此 LookML 的名为 refinements.lkml 的单独文件的示例:

include: "//e_faa_original/Explores/aircraft.explore.lkml"

explore: +aircraft {
  label: "Aircraft Simplified"
  fields: [aircraft.aircraft_serial, aircraft.name, aircraft.count]
}

refinements.lkml 文件包含以下内容:

  • include 参数,用于导入导入项目中的原始 aircraft.explore.lkml 文件(如需详细了解如何引用导入的项目文件,请参阅从其他项目导入文件文档页面)。
  • aircraft 探索的优化:
    • “探索”名称前面的 + 符号表示对现有“探索”进行了优化。
    • label 参数会将“探索”标签更改为“简化飞机”。
    • fields 参数指定“探索”中只会显示三个字段。

最终的结果就像是原始的 aircraft 探索和 aircraft 视图:

explore: aircraft {
  label: "Aircraft Simplified"
  }

view: aircraft {
  sql_table_name: flightstats.aircraft ;;

  dimension: aircraft_serial {
    type: string
    sql: ${TABLE}.aircraft_serial ;;
  }

  dimension: name {
    type: string
    sql: ${TABLE}.name ;;
  }

  measure: count {
    type: count
  }
}

优化的其他用例

如前所述,优化非常适合调整只读属性,如 Looker 代码块导入的文件

但是,当您感觉到需要添加优化并加入模型后,便可以对项目进行非常酷的操作,如以下示例所示。

使用优化来添加分析

您可以使用优化来对模型进行分析,而无需处理原始 LookML 文件。例如,如果有项目是从数据库中的表生成并存储在名为 faa_basic.lkml 的 LookML 文件中的项目,则可以创建一个 faa_analysis.lkml 文件,其中使用优化来添加分析。以下示例展示了一个名为 distance_stats 且包含距离分析的新派生表。此示例展示了 faa_basic.lkml 文件中现有 flights 探索的优化,后者将 distance_stats 派生表联接到 flights 探索中。此外,在示例底部,现有的 flights 视图已经过优化,可从分析中添加新字段:

include: "faa_basic.lkml"

explore: +flights {
  join: distance_stats {
    relationship: one_to_one
    type: cross
  }
}

view: distance_stats {
  derived_table: {
    explore_source: flights {
      bind_all_filters: yes
      column: distance_avg {field:flights.distance_avg}
      column: distance_stddev {field:flights.distance_stddev}
    }
  }
  dimension: avg {
    type:number
    sql: CAST(${TABLE}.distance_avg as INT64) ;;
  }
  dimension: stddev {
    type:number
    sql: CAST(${TABLE}.distance_stddev as INT64) ;;
  }
}
view: +flights {
  measure: distance_avg {
    type: average
    sql: ${distance} ;;
  }
  measure: distance_stddev {
    type: number
    sql: STDDEV(${distance}) ;;
  }
  dimension: distance_tiered2 {
    type: tier
    sql: ${distance} ;;
    tiers: [500,1300]
  }
}

使用优化来向模型添加层

优化的另一个有趣用例是向项目中添加层。您可以创建多个优化文件,然后有策略地添加这些文件来添加图层。

例如,在 FAA 项目中,有一个 faa_raw.lkml 文件包含根据数据库中的表格生成的所有数据视图和探索。此文件包含数据库中每个表的视图,每个表都有每个数据库列的维度。

除了原始文件外,您还可以创建一个 faa_basic.lkml 文件,以通过基本优化(例如,向探索添加联接或向您的视图添加测量)添加新图层:

include: "faa_raw.lkml"

explore: +flights {
  join: carriers {
    sql_on: ${flights.carrier} = ${carriers.name} ;;
  }
}

view: +flights {
  measure: total_seats {
    type: sum
    sql: ${aircraft_models.seats} ;;
  }
}

然后,您可以添加一个 faa_analysis.layer.lkml 文件,以添加包含分析的新层(如需查看分析文件的示例,请参阅使用优化来添加分析子部分)。

然后,只需将所有优化文件都添加到模型文件中即可。您还可以使用模型文件添加优化,使视图指向您要引用的数据库表:

connection: "publicdata_standard_sql"

include: "faa_raw.lkml"
include: "faa_basic.lkml"
include: "faa_analysis.lkml"

view: +flights {
  sql_table_name: lookerdata.faa.flights;;
}
view: +airports {
  sql_table_name: lookerdata.faa.airports;;
}
view: +aircraft {
  sql_table_name: lookerdata.faa.aircraft;;
}
view: +aircraft_models{
  sql_table_name: lookerdata.faa.aircraft_models;;
}
view: +carriers {
  sql_table_name: lookerdata.faa.carriers;;
}

您可以复制此模型文件并指向不同的数据库表,也可以添加您为了定义要在模型中的其他层而创建的不同优化文件。

对 PDT 使用优化

如本页中的与扩展项相比的优化项部分所述,扩展项会创建要扩展的对象的新副本。对于永久性派生表 (PDT),不应使用扩展,因为 PDT 的每个扩展都将在数据库中创建表的新副本。

不过,您可以为 PDT 视图添加优化,因为优化不会为正在优化的对象创建新的副本。

使用元数据查看对象的优化条件

您可以在 Looker IDE 中点击 exploreview 参数,然后使用元数据面板查看对象的任何优化。如需了解详情,请参阅 LookML 对象的元数据文档页面。

注意事项

本地化的项目

当您优化对象时,请注意本地化规则也适用于您的优化。如果您要优化对象,然后定义新的标签或说明,则应在项目的语言区域字符串文件中提供本地化定义。如需了解详情,请参阅本地化 LookML 模型文档页面。