自 Looker 22.6 起,新的 LookML 运行时已可供使用。“运行时”是 Looker 中用于解读 LookML 代码的部分。新运行时比旧运行时更快,并且可以检查更多 LookML 错误。
Looker 强烈建议所有客户迁移到新运行时。新的 LookML 运行时能够捕获之前被忽略的错误,因此启用新的运行时可能会导致出现新的 LookML 错误。这些错误并非由新运行时引起,而是之前就存在的错误,现在才被发现。
此外,如果客户想将实例更改为 Looker (Google Cloud Core),必须先迁移到新的运行时。
如何切换到新运行时
1. 停用“使用旧版 LookML 运行时”(如果可用)
部分 Looker 启用了使用旧版 LookML 运行时旧版功能。停用使用旧版 LookML 运行时旧版功能,以便将 Looker 实例迁移到新运行时。
如果您的 Looker 实例的旧版功能管理页面中没有使用旧版 LookML 运行时旧版功能,则表示您的实例已在使用新版运行时。
2. 确保您的 LookML 项目未配置 new_lookml_runtime:no
您可以在 LookML 项目的清单文件中添加 new_lookml_runtime:no
语句,以替换 Looker 实例的全局使用旧版 LookML 运行时设置。
确保您的 LookML 项目清单文件没有 new_lookml_runtime
参数,或者所有 LookML 项目中的 new_lookml_runtime
都设置为 yes
。
新运行时可能会发现的 LookML 问题
过渡到新运行时后,您可能会发现 LookML 中出现新的错误。新错误并非由新运行时引起,而是之前就存在的问题,现在才被发现。
根据您的 LookML 开发者设置,您可能需要先修正这些错误,然后才能继续提交 LookML 更改。以下部分介绍了新的 LookML 运行时可能会在您的项目中发现的一些问题,以及如何解决这些问题:
- 部分永久性派生表可能会重新构建
- Liquid 表达式中的 HTML 字面值可能会转换为 Unicode
sql_distinct_key
中的无效引用会导致“未知视图”- 没有主键的“不同类型”度量生成不同的 SQL
- 在 Liquid 中使用裸字段引用访问
_filters[]
会将引用的字段添加为所选列
部分永久性派生表可能会重新构建
永久性派生表 (PDT) 键基于 LookML 运行时生成的 SQL。在某些情况下,新运行时可能会为 PDT 生成不同的(但等效的)SQL,从而导致 PDT 键不同。更改 PDT 键会导致 PDT 重建。
Liquid 表达式内的 HTML 字面值可能会转换为 Unicode
新运行时可能会将 Liquid 表达式中的 HTML 标记转换为其 Unicode 等效项。例如,<strong>
标记可能会转换为 <strong>
。在旧版运行时中,HTML 标记可以直接进行比较,如以下示例所示:
html:
{{ value |replace(""), "[" |replace(""), "]" }} ;;
在新运行时中,需要针对 Unicode 进行比较:
html:
{{ value |replace("<strong>"), "[" |replace("</strong>"), "]" }} ;;
sql_distinct_key
中的无效引用会导致“未知视图”
在新运行时中,引用未知字段或视图的 sql_distinct_key
将抛出异常。例如:
measure: total_shipping {
type: sum_distinct
sql: ${order_shipping} ;;
sql_distinct_key: ${some_incorrect_field_name} ;;
}
没有主键的“Distinct”类型指标会生成不同的 SQL
没有 primary-key
或 sql_distinct_key
参数的不同类型指标(average_distinct
、count_distinct
、median_distinct
、percentile_distinct
、sum_distinct
)可能会在新运行时中生成不同的 SQL。
构建不同类型的指标时,请务必指定 primary-key
或 sql_distinct_key
。
在 Liquid 中使用裸字段引用访问 _filters[]
会将引用的字段添加为所选列
在 Looker 中,“裸字段引用”是指未用英文大括号括起来的字段引用,例如 users.created_date
而不是 ${users.created_date}
。
旧版运行时在与 _filters
Liquid 变量搭配使用时,会忽略裸字段引用。新运行时会将该字段添加到 SQL 查询中。
例如,在此维度中,users.created_date
是一个裸引用:
dimension: name { html: {% if _filters[users.created_date] != NULL %} {{rendered_value}} (created: {{_filters[users.created_date]}}) {% else %} {{rendered_value}} {% endif %} ;; }
在旧版运行时中,_filters[users.created_date]
始终会被忽略,只有在满足 {% if %}
的情况下才会考虑第二个条件。在新运行时中,users.created_date
将添加到 SQL 查询的 SELECT
子句中,以便可以评估该条件。
自动将意外字段添加到 Looker 查询中可能会让用户感到困惑,因此最佳实践是不使用裸字段引用,而是使用 ${field_name}
语法。