迁移到新的 LookML 运行时

从 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 实例的全局 Use Legacy LookML Runtime 设置。

确保您的 LookML 项目清单文件不包含 new_lookml_runtime 参数,或者在所有 LookML 项目中将 new_lookml_runtime 设置为 yes

新运行时可能会发现的 LookML 问题

改用新运行时后,您可能会在 LookML 中发现新错误。新错误并非由新运行时导致,而是现有问题。

根据您的 LookML 开发者设置,您可能需要先修正这些错误,然后才能继续提交 LookML 更改。以下部分介绍了新版 LookML 运行时可能会在您的项目中发现的一些问题,以及如何解决这些问题:

部分永久性派生表可能会重新构建

永久性派生表 (PDT) 键基于 LookML 运行时生成的 SQL。在某些情况下,新运行时可能会为 PDT 生成不同的(但等效的)SQL,从而导致 PDT 键不同。更改 PDT 密钥会导致 PDT 重新构建。

Liquid 表达式中的 HTML 字面量可能会转换为 Unicode

新运行时可能会将 Liquid 表达式中的 HTML 标记转换为等效的 Unicode 标记。例如,<strong> 标记可能会转换为 &lt;strong&gt;。在旧版运行时中,可以直接比较 HTML 标记,如以下示例所示:

html:
  {{ value |replace(""), "[" |replace(""), "]" }} ;;

在新版运行时中,需要改为与 Unicode 进行比较:

html:
  {{ value |replace("&lt;strong&gt;"), "[" |replace("&lt;/strong&gt;"), "]" }} ;;

sql_distinct_key 中的引用无效,导致“未知视图”

在新版运行时中,引用未知字段或视图的 sql_distinct_key 将抛出异常。例如:

measure: total_shipping {
  type: sum_distinct
  sql: ${order_shipping} ;;
  sql_distinct_key: ${some_incorrect_field_name} ;;
}

没有主键的“不重复”类型衡量结果会生成不同的 SQL

不带 primary-keysql_distinct_key 参数的类型指标(average_distinctcount_distinctmedian_distinctpercentile_distinctsum_distinct)在新版运行时中可能会生成不同的 SQL。

构建不重复类型衡量指标时,请务必指定 primary-keysql_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} 语法。