概览
借助 LookML 优化,您可以调整现有的视图或探索,而无需修改包含它的 LookML 文件。此方式非常适合:
- 使用 Looker Blocks 的项目,此类项目使用预先构建的 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 界面中,用户会看到航空公司维度,就像您将该维度添加到原始视图文件本身一样。
如需了解更详细的实现信息,请参阅下面的示例。
优化后的覆盖率与扩展的对比情况
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
,同时该维度会显示在最终视图中。
在一些情况下,优化会进行附加而不是替换;请参阅本页面的部分参数是附加的部分,了解更多信息。
有些参数可以累加
在许多情况下,如果优化条件包含与优化对象相同的参数,则优化指标将覆盖优化对象的参数值。
但是,对于某些参数,优化可以相加,也就是说,基础对象的值与经过优化的对象中的值结合使用。
以下参数为附加参数:
对于维度和指标:
对于观看次数:
extends
(如需了解详情,请参阅本页面上的优化累加extends
部分)部分。)
对于探索:
access_filter
aggregate_table
extends
(如需了解详情,请参阅本页面上的优化累加extends
部分)部分。)join
query
例如,下面的视图包含一个带有 link
参数的 name
维度:
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
和优化的行为:
- 扩展某个对象会创建一个新的对象副本,然后在该对象的基础上进行构建。例如,您可以创建一个定义所有字段的基本视图,然后创建多个扩展基本视图的新视图。每个新视图都将纳入基本视图的副本,然后开发者可以在此处添加不同的字段、过滤器或其他属性来修改基础视图中的内容。思路是,先从基础对象开始,然后在多个其他对象中以不同方式使用它。(如需全面了解如何使用扩展程序,请参阅通过扩展重复使用代码文档页面。)
- 优化对象会向对象添加一层修改,但与扩展不同,优化不会为对象创建多个副本。这个想法是以基础对象为基础,无需修改其原始 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 元素,那么系统将使用扩展对象中的版本,除非该参数是累加参数。如需了解详情,请参阅通过扩展代码重复使用代码文档页面。 - Looker 如何实现优化:如果 Lookify 元素在多个优化中定义,则最后的优化将覆盖之前的优化。如需了解详情,请参阅本页面上的按顺序应用优化部分。
最后,您应了解 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
Discover 实现 label
的值:
- 该对象中指定的
extends
中的值。由于orders
探索具有extends
参数,因此 Looker 会从要扩展的对象(在本例中为orders_base
探索)中的 LookML 元素开始。此时,label
值为“Orders Base”。 - 在对象的优化中指定的
extends
的值。由于orders
有优化,因此优化具有extends
形参,然后 Looker 会应用优化后的扩展中的 LookML 元素(在本例中为users_base
)。此时,label
值为“Users Base”。 - 对象中的值。现在,所有扩展程序均已得到解决,Looker 会应用扩展对象(在本例中为
orders
探索)的元素。如果存在任何冲突,扩展对象将会胜出。因此,label
的值现在为“Orders”。 - 通过对象的优化获得的值。最后,Looker 会应用
orders
探索的任何优化元素的元素。如果存在任何冲突,优化对象将胜出。因此,现在label
值为“优化订单”。
优化条件 extends
可累加
正如本页中的优化替换参数部分所述,优化通常会覆盖对象的原始设置。extends
参数并非如此。在优化中使用 extends
时,extends
参数中的值会附加到原始对象或上一个优化中扩展的项列表(如果有)。如果存在冲突,系统会优先考虑扩展链中的最后一项。
例如,下面是名为“orders_base
”的基本探索和一个名为“扩展”的orders
“探索”。此外,还有 users_base
探索和 +orders
优化可以扩展 users_base
:
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
中的任何冲突元素。
一次重复使用多个对象文档页面介绍了一次一次扩展多个对象的概念。
最后一点要注意:在此示例中,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
Discover 文件。在 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
探索的相关优化:
最终的结果就像是原始的 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 Blocks 或导入的文件。
但是,一旦您体验了添加优化条件并将其加入模型中的内容,就可以对您的项目执行一些很酷的操作,如以下示例所示。
使用优化条件添加分析
您可以使用优化来为模型添加分析,而无需更改原始 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 中的 explore
或 view
参数,然后使用元数据面板查看对象的任何优化条件。如需了解相关信息,请参阅 LookML 对象元数据文档页面。
注意事项
本地化项目
优化对象时,请注意本地化规则也适用于您的优化。如果您要优化对象,然后定义新标签或说明,则应在项目的语言区域字符串文件中提供本地化定义。如需了解详情,请参阅本地化您的 LookML 模型文档页面。