概览
借助 LookML 优化功能,您无需修改包含相应视图或探索的 LookML 文件,即可调整现有视图或探索。这非常适用于以下情况:
- 包含 Looker 块的项目,这些块使用预构建的 LookML 部分
- 从其他项目导入文件的项目
- 您经常需要根据数据库中的表生成文件的项目
- 您希望在模型或项目之间共享 LookML,同时在每个位置进行自定义(枢纽和辐条配置)
例如,如果您的项目中有以下 View 文件:
view: flights {
sql_table_name: flightstats.accidents ;;
dimension: id {
label: "id"
primary_key: yes
type: number
sql: ${TABLE}.id ;;
}
}
您可以优化 flights
视图,如以下示例所示:使用具有相同视图名称的 view
参数,但在名称前面添加加号 (+
) 以指明它是对现有视图的优化。
此优化会向现有的 flights
视图添加 air_carrier
维度:
view: +flights {
dimension: air_carrier {
type: string
sql: ${TABLE}.air_carrier ;;
}
}
此优化可添加到项目中的任何 LookML 文件中,例如模型文件、视图文件,或添加到自己的专用 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 界面中,用户会看到航空公司维度,就像您将该维度添加到原始视图文件本身一样。
如需了解更详细的实现信息,请参阅示例部分。
优化与扩展的比较
Looker 还支持扩展 LookML 对象。当您想要创建现有视图或探索的新副本,以便向其中添加新对象时,扩展功能非常有用。例如,您可以创建一个用于定义所有字段的基础视图,然后创建多个用于扩展基础视图的新视图。然后,您可以修改这些新视图,以隐藏基视图中的某些字段,或更改基视图中字段的定义或标签。
如果您想修改现有视图或探索,通过对某些对象进行调整或微调,但不想创建视图或探索的副本,那么精炼功能非常有用。如果您无法或不想修改基本视图或“探索”,或者创建新视图或“探索”需要对其他 LookML 参考进行大量更改,则非常适合使用“优化”。如需查看此用例的示例,请参阅本页的示例部分。
对于大多数用例,优化是 extends
的更简单、更清晰的替代方案。
高级 LookML 开发者可能需要在 LookML 精确化中使用 extends
参数。如需了解详情,请参阅本页的精炼项可以包含 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
,并且该维度将显示在最终视图中。
在某些情况下,优化是累加的,而不是替换的;如需了解详情,请参阅本页的部分参数是累加的部分。
某些参数是累加的
在许多情况下,如果精炼项包含与要精炼的对象相同的参数,精炼项将替换精炼对象的参数值。
但对于某些参数,精炼项可以是叠加的,也就是说,基础对象中的值会与经过精炼的对象中的值结合使用。
以下参数是累加的:
对于维度和测量:
对于参数:
对于派生表:
对于观看:
extends
(如需了解详情,请参阅本页的精炼extends
是累加的部分。)
对于探索:
access_filter
aggregate_table
extends
(如需了解详情,请参阅本页的精炼extends
是累加的部分。)join
query
例如,下面是一个具有 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 开发者可以以许多富有创意的方式使用优化功能。但这也意味着,开发者必须非常注意优化应用的顺序:
- 在项目中,系统会按照包含其文件的顺序应用优化。最后包含的文件中的优化设置会覆盖先前包含的文件中的优化设置。
- 在单个文件中,优化会从上往下逐行应用。行号最高的优化项会最后应用,并且会覆盖任何较早的优化项(如果存在冲突)。
例如,在以下视图文件中,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
中的优化设置将优先。
使用 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
和优化功能的行为总结如下:
- 扩展对象会创建该对象的新副本,然后在此基础上进行构建。例如,您可以创建一个用于定义所有字段的基础视图,然后创建多个用于扩展基础视图的新视图。这些新视图中的每个视图都会包含基准视图的副本,开发者可以在此基础上添加不同的字段、过滤条件或其他属性,以修改基准视图中的内容。基本思路是,您先创建一个基对象,然后在多个其他对象中以不同的方式使用该对象。(如需详细了解如何使用 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
“探索”。
Looker 如何在优化中实现 extends
在精炼项中扩展对象是一项高级 LookML 概念。在精炼中使用 extends
之前,您应对以下内容有深刻的理解:
- Looker 如何实现
extends
:如果在扩展对象和扩展器对象中都定义了 LookML 元素,则使用扩展对象中的版本,除非参数是累加。如需了解详情,请参阅使用“extends”重复使用代码文档页面。 - Looker 如何实现精炼:如果某个 LookML 元素在多个精炼中定义,则最后一个精炼会替换之前的精炼。如需了解详情,请参阅本页中的优化会按顺序应用部分。
最后,您应该了解 Looker 如何结合这些原则来实现用于优化的 extends
。下面是 Looker 实现的顺序,如果发生冲突,每一步都会替换之前的步骤:
- 对象中指定的
extends
中的值 - 对象的优化项中指定的
extends
中的值 - 对象中的值
- 对象的细化值
下面的示例展示了在实现的每个步骤中跟踪 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
“探索”实现 label
值:
- 对象中指定的
extends
中的值。由于orders
“探索”具有extends
参数,因此 Looker 会从要扩展的对象(在本例中为orders_base
“探索”)中的 LookML 元素开始。此时,label
值为“Orders Base”。 - 对象的优化项中指定的
extends
中的值。由于orders
具有精确化条件,并且精确化条件具有extends
参数,因此 Looker 会应用精确化条件扩展程序中的 LookML 元素,在本例中为users_base
“探索”部分。此时,label
值为“用户群”。 - 对象中的值。现在,所有扩展程序都已处理完毕,Looker 会应用扩展对象(在本例中为
orders
“探索”)中的元素。如果存在任何冲突,则扩展对象优先。现在,label
的值为“Orders”。 - 对象的优化值。最后,Looker 会应用
orders
“探索”的任何优化中的元素。如果存在任何冲突,则优先使用精炼对象。现在,label
的值为“Orders Refined”。
优化 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_base
和 users_base
,就像这是“探索”的原始 LookML 一样:
explore: orders {
extends: [orders_base, users_base]
}
然后,如果存在任何冲突,则优先级为扩展链中的最后一个项。在此示例中,users_base
中的元素会替换 orders_base
中的任何冲突元素。
如需了解一次扩展多个对象的概念,请参阅使用 extends 重复使用代码文档页面。
最后需要注意的是:在此示例中,explore
参数的顺序无关紧要。但是,如果同一对象有多个精确化,精确化的顺序很重要。如本页中的优化会按顺序应用部分所述,文件中的最后一个优化会覆盖之前的优化。
在 LookML 项目中使用精炼
以下是优化项目中视图和探索的大致步骤:
- 确定您要优化的视图或“探索”部分。
- 确定要将优化项存储在何处。您可以在任何现有 LookML 文件中添加精炼条件,也可以为精炼条件创建单独的 LookML 文件。(如需查看创建通用 LookML 文件的示例,请参阅了解其他项目文件文档页面上的创建数据测试文件部分。)
- 使用
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
Explore 是导入的文件,因此您无法直接修改它。不过,您可以为其添加精确化条件。以下是一个名为 refinements.lkml
的单独文件的示例,其中包含此 LookML:
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
“探索”部分的优化:
最终结果看起来就像是原始的 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
}
}
如需查看使用优化项针对多个用例自定义单个视图的示例,请参阅使用 DRY LookML 最大限度提高代码可重用性:针对多个用例自定义单个基本视图实战宝典食谱。
其他优化用例
如前所述,优化非常适合调整只读 LookML 对象,例如 Looker 块或导入的文件。
不过,一旦您熟悉了如何添加精炼项并将其添加到模型中,就可以使用项目做出非常酷的事情,如以下示例所述。
使用优化功能添加分析
您可以使用优化功能向模型添加分析,而无需更改原始 LookML 文件。例如,如果某个项目中的视图和探索是从数据库中的表生成并存储在名为 faa_basic.lkml
的 LookML 文件中,您可以创建一个 faa_analysis.lkml
文件,并在其中使用精炼项添加分析。以下是一个名为 distance_stats
的新派生表的示例,其中包含距离分析。此示例展示了对 faa_basic.lkml
文件中现有 flights
Explore 的优化,该优化会将 distance_stats
派生表联接到 flights
Explore。此外,在示例底部,现有的 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 中点击 explore
或 view
参数,然后使用元数据面板查看对象的任何优化。如需了解详情,请参阅 LookML 对象的元数据文档页面。
需要考虑的事项
已本地化的项目
请注意,在优化对象时,本地化规则也适用于优化结果。如果您要优化对象,然后定义新的标签或说明,则应在项目的语言区域字符串文件中提供本地化定义。如需了解详情,请参阅将 LookML 模型本地化文档页面。