迁移到新的 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 实例的全局使用旧版 LookML 运行时设置。

确保您的 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} ;;
}

没有主键的“Distinct”类型指标会生成不同的 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} 语法。