用法
datagroup: datagroup_name {
max_cache_age: "24 hours"
sql_trigger: SELECT max(id) FROM my_tablename ;;
interval_trigger: "12 hours"
label: "desired label"
description: "description string"
}
|
层次结构
datagroup |
默认值
无
接受
数据组的标识符,以及定义数据组属性的子参数。 |
定义
使用 datagroup 为 探索 分配 缓存 政策,和/或为 永久性派生表 (PDT) 指定持久性策略。如果您希望为不同的探索和 PDT
使用多个政策,请使用单独的 datagroup 参数来指定每个政策。
仅使用字母、数字和下划线为数据组提供唯一名称。不允许使用其他字符。
label:为数据组指定可选标签。如需了解详情,请参阅本页面的label和description部分。description:为数据组指定可选说明,该说明可用于解释数据组的用途和机制。如需了解详情,请参阅本页面的label和description部分。
使用 datagroup 子参数指定缓存和持久性政策的详细信息:
max_cache_age:指定一个定义时间段的字符串。当查询的缓存期限超过该时间段时,Looker 会使缓存失效。下次发出查询时,Looker 会将查询发送到数据库以获取最新结果。如需了解详情,请参阅本页面的max_cache_age部分。sql_trigger:指定一个返回一行一列的 SQL 查询。如果查询返回的值与查询之前的结果不同,则数据组将进入触发状态。如需了解详情,请参阅本页面的sql_trigger部分。interval_trigger:指定触发数据组的时间表,例如"24 hours"。如需了解详情,请参阅本页面的interval_trigger部分。
通常,最佳解决方案是将 max_cache_age 与 sql_trigger 或 interval_trigger
结合使用。指定与数据库中的数据加载 (ETL) 匹配的 sql_trigger 或 interval_trigger
值,然后指定一个 max_cache_age 值,如果 ETL 失败,该值将使旧数据失效。max_cache_age
参数可确保,如果数据组的缓存未被 sql_trigger 或 interval_trigger 清除,则缓存条目将在特定时间过期。这样,数据组的失败模式将是查询数据库,而不是从
Looker 缓存提供过时的数据。
数据组不能同时具有
sql_trigger和interval_trigger参数。如果您使用这两个参数定义数据组,则数据组将使用interval_trigger值并忽略sql_trigger值,因为sql_trigger参数在查询数据库时需要使用数据库资源。对于使用 用户属性指定连接参数的连接,如果您想使用 SQL 查询触发器定义数据组缓存政策,则必须使用 PDT 替换字段创建单独的连接。
如果没有 PDT 替换,您仍然可以为模型及其探索使用数据组,前提是您仅使用max_cache_age(而不是sql_trigger)定义数据组的缓存政策。
max_cache_age
max_cache_age 参数指定一个字符串,该字符串包含一个整数,后跟“seconds”“minutes”或“hours”。此时间段是使用数据组的探索查询可以使用缓存结果的最长时间段。
当查询的缓存期限超过 max_cache_age 时,Looker 会使缓存失效。下次发出查询时,Looker
会将查询发送到数据库以获取最新结果。如需了解数据在缓存中存储多长时间,请参阅缓存查询文档页面。
max_cache_age 参数仅定义缓存失效的时间,不会触发 PDT 的重建。如果您仅使用 max_cache_age
定义数据组,则如果任何派生表分配给该数据组,您将收到 LookML 验证警告。如果您将派生表分配给仅具有 max_cache_age
参数的数据组,则该派生表将在首次查询该表时构建,但该派生表将无限期地位于底层存储架构中,并且永远不会重建,即使再次查询也是如此。如果您打算让 PDT 以特定的时间间隔重建,则应向数据组添加 interval_trigger 参数,以定义 PDT 重建时间表。
sql_trigger
使用 sql_trigger 参数指定一个 SQL 查询,该查询返回一行一列。Looker 会按照数据库连接的数据组和 PDT 维护时间表 字段中指定的时间间隔运行 SQL 查询。如果查询返回的值与之前的结果不同,则数据组将进入触发状态。触发数据组后,Looker 会重建 datagroup_trigger 参数中指定了该数据组的所有 PDT。PDT 重建完成后,数据组将进入就绪状态,Looker
会使使用该数据组的所有探索的缓存结果失效。
通常,sql_trigger 指定一个 SQL 查询,该查询指示何时发生了新的数据加载 (ETL),例如通过查询表中的 max(ID)。您还可以使用
sql_trigger 指定一天中的特定时间,方法是查询当前日期并根据需要向该时间戳添加额外的小时数,以达到您想要的时间,例如凌晨 4 点。
请注意以下有关 sql_trigger 的重要事项:
- 如果您的数据库连接使用 OAuth 或 用户属性,并且您已为该连接停用 PDT,则无法使用
sql_trigger。这是因为 Looker 需要静态凭据才能访问您的数据库,以运行sql_trigger参数中指定的查询。启用 PDT 后,即使您的连接使用动态凭据(例如 OAuth 或用户属性),您也可以使用 PDT 替换 字段为 Looker 提供单独的静态登录凭据,以用于 PDT 进程。但是,如果停用 PDT,并且您的连接使用 OAuth 或用户属性,则无法为 Looker 提供sql_trigger查询所需的静态用户凭据。 - Looker 不会对
sql_trigger执行时区转换。如果您想在一天中的特定时间触发数据组,请在配置数据库的时区中设置触发器。
如需了解有关设置 SQL 查询以触发数据组的想法,请参阅 参数文档sql_trigger中的这些示例。
interval_trigger
您可以使用可选的 interval_trigger 子参数来指定重建的时间长度。在 interval_trigger
参数中,您传递一个字符串,该字符串包含一个整数,后跟“seconds”“minutes”或“hours”。
label 和 description
您可以使用可选的 label 和 description 子参数来添加自定义标签和数据组说明。您还可以使用 语言区域字符串文件 对这些子参数进行本地化。
这些子参数显示在管理 面板的数据库 部分中的数据组 页面上。如需详细了解这些子参数的显示方式,请参阅管理设置 - 数据组文档页面。
示例
以下示例重点介绍了 datagroup 的用例,包括:
创建缓存政策,以便在有新数据可用时或至少每 24 小时检索一次新结果
如需创建缓存政策,以便在有新数据可用时或至少每 24 小时检索一次新结果,请执行以下操作:
- 使用
orders_datagroup数据组(在模型文件中)为缓存政策命名。 - 使用
sql_trigger参数指定指示有新数据的查询:select max(id) from my_tablename。每当数据更新时,此查询都会返回一个新数字。 - 使用
max_cache_age设置,如果数据已缓存 24 小时,则使其失效。 - 使用可选的
label和description参数来添加自定义标签和数据组说明。
datagroup: orders_datagroup {
sql_trigger: SELECT max(id) FROM my_tablename ;;
max_cache_age: "24 hours"
label: "ETL ID added"
description: "Triggered when new ID is added to ETL log"
}
如需将 orders_datagroup 缓存政策用作模型中探索的默认政策,请在模型级别使用 persist_with 参数,并指定 orders_datagroup:
persist_with: orders_datagroup
如需将 orders_datagroup 缓存政策用于特定探索,请在 explore 参数下添加 persist_with 参数,并指定 orders_datagroup。如果在模型级别指定了默认数据组,您可以在 explore 下使用 persist_with
参数来替换默认设置。
explore: customer_facts {
persist_with: orders_datagroup
...
}
如需使用 orders_datagroup 数据组缓存政策来重建 PDT,您可以在 derived_table 参数下添加 datagroup_trigger,并指定 orders_datagroup:
view: customer_order_facts {
derived_table: {
datagroup_trigger: orders_datagroup
...
}
}
创建数据组以安排在每个月的最后一天进行传送
您可能希望创建一个时间表,以便在每个月末发送内容传送。但是,并非所有月份的天数都相同。您可以创建一个数据组,以便在每个月末触发内容传送,而不管特定月份的天数是多少。
使用 SQL 语句创建一个数据组,以便在每个月末触发:
datagroup: month_end_datagroup { sql_trigger: SELECT (EXTRACT(MONTH FROM DATEADD( day, 1, GETDATE()))) ;; description: "Triggered on the last day of each month" }此示例采用 Redshift SQL,可能需要针对不同的数据库进行略微调整。
此 SQL 语句返回明天所在的月份(在月末,明天是下个月)- 因此数据组将被触发。对于其他每一天,明天都在同一个月,因此数据组不会被触发。
在新的或现有的时间表中选择数据组。
基于数据组的时间表仅在所有使用该数据组参数保留的 PDT 的重新生成过程完成后发送,确保您的传送包含最新数据。
将数据组与级联 PDT 结合使用
对于永久性 级联派生表,如果在一个永久性派生表 (PDT) 的定义中引用了另一个 PDT,您可以使用数据组为级联 PDT 链指定 持久性策略。
例如,以下是模型文件的一部分,该文件定义了一个名为 user_facts_etl 的数据组和一个名为 user_stuff
的探索。user_stuff 探索使用 user_facts_etl 数据组保留:
datagroup: user_facts_etl {
sql_trigger: SELECT max(ID) FROM etl_jobs ;;
}
explore: user_stuff {
persist_with: user_facts_etl
from: user_facts_pdt_1
join: user_facts_pdt_2 {
...
}
...
}
user_stuff 探索将 user_facts_pdt_1 视图与 user_facts_pdt_2 视图联接。这两个视图都基于使用
user_facts_etl 数据组作为持久性触发器的 PDT。user_facts_pdt_2 派生表引用了
user_facts_pdt_1 派生表,因此这些是级联 PDT。以下是这些 PDT 的视图文件中的一些 LookML:
view: user_facts_pdt_1 {
derived_table: {
datagroup_trigger: user_facts_etl
explore_source: users {
column: customer_ID {field:users.id}
column: city {field:users.city}
...
}
}
}
view: user_facts_pdt_2 {
derived_table: {
sql:
SELECT ...
FROM ${users_facts_pdt_1.SQL_TABLE_NAME} ;;
datagroup_trigger: user_facts_etl
}
}
如果您有级联 PDT,则必须确保 PDT 没有不兼容的数据组缓存政策。
Looker 重新生成器会检查状态并按如下方式启动这些 PDT 的重建:
- 默认情况下,Looker 重新生成器每五分钟检查一次数据组的
sql_trigger查询(您的 Looker 管理员可以使用数据库连接上的 数据组和 PDT 维护时间表 设置指定此时间间隔)。 - 如果
sql_trigger查询返回的值与之前检查中的查询结果不同,则数据组将进入触发状态。在此示例中,如果etl_jobs表具有新的ID值,则会触发user_facts_etl数据组。 触发
user_facts_etl数据组后,Looker 重新生成器会重建使用该数据组的所有 PDT(换句话说,所有使用datagroup_trigger: user_facts_etl定义的 PDT)。在此示例中,重新生成器会重建user_facts_pdt_1,然后重建user_facts_pdt_2。当 PDT 共享相同的
datagroup_trigger时,重新生成器会按照依赖关系的顺序重建 PDT,首先构建被其他表引用的表。如需详细了解 Looker 如何重建级联派生表,请参阅 Looker 中的派生表文档页面。当重新生成器重建数据组中的所有 PDT 时,重新生成器会将
user_facts_etl数据组从触发状态中移除。一旦
user_facts_etl数据组不再处于触发状态,Looker 会重置使用user_facts_etl数据组的所有模型和探索的缓存(换句话说,所有使用persist_with: user_facts_etl定义的模型和探索)。在此示例中,这意味着 Looker 会重置user_stuff探索的缓存。系统将发送基于
user_facts_etl数据组的所有 已安排的内容传送。在此示例中,如果存在包含来自user_stuff探索的查询的已安排传送,则将从数据库中检索已安排的查询以获取最新结果。
跨模型文件共享数据组
此示例展示了如何与多个模型文件共享数据组。这种方法的优势在于,如果您需要修改数据组,只需在一个位置修改数据组,这些更改就会在您的所有模型中生效。
如需与多个模型文件共享数据组,请先创建一个仅包含数据组的单独文件,然后使用 include 参数将数据组文件 include 到您的模型文件中。
创建数据组文件
创建一个单独的 .lkml 文件来包含您的数据组。您可以采用与创建单独的 .lkml 探索文件相同的方式创建 .lkml 数据组文件。
在此示例中,数据组文件名为 datagroups.lkml:
datagroup: daily {
max_cache_age: "24 hours"
sql_trigger: SELECT CURRENT_DATE();;
}
将数据组文件包含在模型文件中
创建数据组文件后,您可以将其 include 到两个模型中,并使用 persist_with 将数据组应用于模型中的各个探索,或将数据组应用于模型中的所有探索。
例如,以下两个模型文件都 include 了 datagroups.lkml 文件。
此文件名为 ecommerce.model.lkml。daily 数据组在 explore 级别使用,因此它仅适用于
orders 探索:
include: "datagroups.lkml"
connection: "database1"
explore: orders {
persist_with: daily
}
下一个文件名为 inventory.model.lkml。daily 数据组在 model
级别使用,因此它适用于模型文件中的所有探索:
include: "datagroups.lkml"
connection: "database2"
persist_with: daily
explore: items {
}
explore: products {
}