数据组

用法

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 参数来指定每项政策。

仅使用字母、数字和下划线为数据组提供一个唯一名称。不允许使用其他字符。

您可以为数据组添加标签和说明:

使用 datagroup 子参数指定缓存和持久性政策的详细信息:

  • max_cache_age:指定定义时间段的字符串。当查询的缓存存在时间超过相应时间段时,Looker 会使该缓存失效。下次发出查询时,Looker 会将查询发送到数据库以获取最新结果。如需了解详情,请参阅本页面的 max_cache_age 部分。
  • sql_trigger:指定返回一行一列的 SQL 查询。如果查询返回的值与查询之前的结果不同,则数据组会进入触发状态。如需了解详情,请参阅本页面的 sql_trigger 部分。
  • interval_trigger:指定触发数据组的时间安排,例如 "24 hours"。如需了解详情,请参阅本页面的 interval_trigger 部分。

通常,最好的解决方案是将 max_cache_agesql_triggerinterval_trigger 结合使用。指定与数据库中的数据加载 (ETL) 相匹配的 sql_triggerinterval_trigger 值,然后指定一个 max_cache_age 值,如果 ETL 失败,该值将使旧数据失效。max_cache_age 参数可确保,如果数据组的缓存未被 sql_triggerinterval_trigger 清除,则缓存条目将在一定时间后过期。这样,数据组的故障模式将是查询数据库,而不是从 Looker 缓存中提供过时的数据。

一个数据组不能同时包含 sql_triggerinterval_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 查询,该查询返回的行数和列数均为 1。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 后,您可以使用 PDT 替换项字段为 PDT 进程提供单独的静态登录凭据,即使您的连接使用动态凭据(例如 OAuth 或用户属性)也是如此。但如果停用 PDT,并且您的连接使用 OAuth 或用户属性,您将无法为 Looker 提供 sql_trigger 查询所需的静态用户凭据。
  • Looker 不会针对 sql_trigger 执行时区转换。如果您想在一天中的特定时间触发数据组,请在数据库配置的时区中设置触发器。

如需了解如何设置 SQL 查询以触发数据组,请参阅sql_trigger 参数文档中的这些示例

interval_trigger

您可以使用可选的 interval_trigger 子参数来指定重建的时间时长。在 interval_trigger 参数中,您传递的字符串包含一个整数,后跟“seconds”“minutes”或“hours”。

labeldescription之间

您可以使用可选的 labeldescription 子参数来添加自定义标签和数据组说明。您还可以使用语言区域字符串文件对这些子形参进行本地化。

这些子形参会显示在管理面板的数据库部分中的数据组页面上。如需详细了解这些数据组的显示方式,请参阅管理设置 - 数据组文档页面。

示例

以下示例重点介绍了 datagroup 的使用情形,包括:

创建缓存政策,以便在有新数据可用时或至少每 24 小时检索一次新结果

如需创建一种缓存政策,以便在有新数据可用时或至少每 24 小时检索一次新结果,请执行以下操作:

  • 使用模型文件中的 orders_datagroup 数据组来命名缓存政策。
  • 使用 sql_trigger 参数指定表示有新数据的查询:select max(id) from my_tablename。每当数据更新时,此查询都会返回一个新数字。
  • 使用 max_cache_age 设置可在数据缓存 24 小时后使其失效。
  • 使用可选的 labeldescription 参数可添加自定义标签和数据组说明。
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
    ...
  }
}

创建数据组以安排在每个月的最后一天进行交付

您可能需要创建一个日程安排,以便在每个月末发送内容交付。不过,并非所有月份的天数都相同。您可以创建一个数据组,以在每个月末触发内容交付,而无论特定月份的天数是多少。

  1. 使用 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 语句会返回明天所在的月份(在当月的最后一天,明天是下个月),因此系统会触发数据组。对于其他所有日期,明天都在同一个月份,因此不会触发数据组。

  2. 在新时间表或现有时间表中选择数据组。

基于数据组的时间表仅在所有使用相应数据组参数的持久性 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 再生器每 5 分钟检查一次数据组的 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();;
}

在模型文件中添加 datagroups 文件

现在,您已创建数据组文件,接下来可以在两个模型中include该文件,并使用 persist_with 将数据组应用于模型中的各个探索,或将数据组应用于模型中的所有探索。

例如,以下两个模型文件都 includedatagroups.lkml 文件。

此文件的名称为 ecommerce.model.lkmldaily 数据组是在 explore 级别使用的,因此它仅适用于 orders 探索:

include: "datagroups.lkml"

connection: "database1"

explore: orders {
  persist_with: daily
}

下一个文件的名称为 inventory.model.lkmldaily 数据组在 model 级别使用,因此它会应用于模型文件中的所有探索:

include: "datagroups.lkml"
connection: "database2"
persist_with: daily

explore: items {
}

explore: products {
}