PDT 增幅

在 Looker 中,永久性派生表 (PDT) 会写入数据库的临时架构。Looker 会基于其持久化策略保留并重新构建 PDT。当 PDT 被触发以重新构建时,默认情况下,Looker 会重新构建整个表。

增量 PDT 是 Looker 通过将新数据附加到表而不是完整地重新构建表来构建的 PDT:

一个大表格,其中突出显示了三行(底部),显示了少量添加到表中的新行。

如果您的方言支持增量 PDT,您可以将以下类型的 PDT 转换为增量 PDT:

首次针对增量 PDT 运行查询时,Looker 会构建整个 PDT 来获取初始数据。如果表较大,初始构建可能需要花费大量时间,就像构建任何大型表一样。构建初始表后,后续构建将逐步完成,且在策略性地设置增量 PDT 所需的时间会更短。

对于增量 PDT,请注意以下事项:

  • 只有使用基于触发器的保留策略(datagroup_triggersql_trigger_valueinterval_trigger)的 PDT 才会支持增量 PDT。使用 persist_for 持久策略的 PDT 不支持增量 PDT。
  • 对于基于 SQL 的 PDT,表查询必须使用 sql 参数进行定义,才能用作增量 PDT。使用 sql_create 参数或 create_process 参数定义的基于 SQL 的 PDT 无法增量构建。如本页示例 1 所示,Looker 使用 INSERT 或 Merge 命令为增量 PDT 创建增量。无法使用自定义数据定义语言 (DDL) 语句定义派生表,因为 Looker 无法确定创建准确的增量所需的 DDL 语句。
  • 增量 PDT 的源表必须针对基于时间的查询进行优化。具体而言,用于时间增量键的基于时间的列必须具有优化策略,例如分区排序键索引或您的方言支持的任何优化策略。强烈建议优化源表,因为每当增量表更新时,Looker 都会查询源表,以确定用于增量键的基于时间列的最新值。如果源表未针对这些查询进行优化,Looker 针对最新值的查询可能会非常慢并且费用高昂。

制定增量 PDT

您可以使用以下参数将 PDT 转换为增量 PDT:

  • increment_key(为了使 PDT 成为增量 PDT):定义了应查询新记录的时间段。
  • {% incrementcondition %} 液体过滤条件(使基于 SQL 的 PDT 成为增量 PDT 所必需的;不适用于基于 LookML 的 PDT):将递增键连接到增量键所基于的数据库时间列。如需了解详情,请参阅 increment_key 文档页面。
  • increment_offset(可选):一个整数,用于定义为每个增量 build 重新构建之前的时间段的数量(按增量键的粒度)。对于延迟数据,increment_offset 参数很有用,因为在之前的相应时间段内最初构建了相应的增量并附加到 PDT 时,之前的时间段可能不包含新数据。

如需查看相关示例,了解如何通过永久性原生派生表基于 SQL 的永久性派生表汇总表创建增量 PDT,请参阅 increment_key 参数文档页面。

下面的简单文件示例定义了一个基于 LookML 的增量 PDT:

view: flights_lookml_incremental_pdt {
  derived_table: {
    indexes: ["id"]
    increment_key: "departure_date"
    increment_offset: 3
    datagroup_trigger: flights_default_datagroup
    distribution_style: all
    explore_source: flights {
      column: id {}
      column: carrier {}
      column: departure_date {}
    }
  }

  dimension: id {
    type: number
  }
  dimension: carrier {
    type: string
  }
   dimension: departure_date {
    type: date
  }
}

此表会在您首次运行查询时完全构建。之后,PDT 将以一天为增量 (increment_key: departure_date) 重新构建,过去三天 (increment_offset: 3)。

递增键基于 departure_date 维度,后者实际上是 departure 维度组中的 date 时间范围。(如需简要了解维度组的工作原理,请参阅 dimension_group 参数文档页面。)维度组和时间范围均在 flights 视图中定义,即此 PDT 的 explore_source。下面展示了如何在 flights 视图文件中定义 departure 维度组:

...
  dimension_group: departure {
    type: time
    timeframes: [
      raw,
      date,
      week,
      month,
      year
    ]
    sql: ${TABLE}.dep_time ;;
  }
...

增量参数与持久性策略的相互作用

PDT 的 increment_keyincrement_offset 设置与 PDT 的持久性策略无关:

  • 仅当 PDT 递增时,增量 PDT 的持久化策略才会确定。除非触发表的持久策略,或者 PDT 使用“探索”部分的重新构建派生表和运行选项手动触发 PDT,否则 PDT 构建器不会修改增量 PDT。
  • 当 PDT 递增时,PDT 构建器将根据最新时间增量(由 increment_key 参数定义的时间段)来确定上次向表添加最新数据的时间。在此基础上,PDT 构建器会将数据截断为表中最近时间增量的开头,然后从那里构建最新的增量。
  • 如果 PDT 具有 increment_offset 参数,则 PDT 构建器还会重新构建 increment_offset 参数中指定的先前时间段的数量。上一个时间段是从最近递增时间(由 increment_key 参数定义的时间段)开始算起。

以下示例场景展示了如何通过显示 increment_keyincrement_offset 和持久策略的交互,对 PDT 进行增量更新。

示例 1

此示例使用了一个具有以下属性的 PDT:

  • 递增键:date
  • 增量偏移:3
  • 持久性策略:每月第一天触发一次

此表格的更新方式如下:

  • “每月永久性”策略意味着该表每月自动构建一次。也就是说,我们将于 5 月 1 日添加表格中最后一行。
  • 由于此 PDT 有一个基于日期的增量键,因此 PDT 构建器会将 5 月 1 日截断为当天的第一天,并重建 5 月 1 日到 6 月 1 日的数据。
  • 此外,此 PDT 的增量偏移为 3。因此,PDT 构建工具还会在 5 月 1 日之前重新构建过去三个时间段(天数)的数据。结果是,系统重建了 4 月 28 日、29 日、30 日和 6 月 1 日的数据。

用 SQL 术语来说,以下命令可于 6 月 1 日运行 PDT 构建器,以确定应该重新构建的现有 PDT 中的行数:

## Example SQL for BigQuery:
SELECT FORMAT_TIMESTAMP('%F %T',TIMESTAMP_ADD(MAX(pdt_name),INTERVAL -3 DAY))

## Example SQL for other dialects:
SELECT CAST(DATE_ADD(MAX(pdt_name),INTERVAL -3 DAY) AS CHAR)

以下是 PDT 构建器将于 6 月 1 日运行以构建最新增量的 SQL 命令:

## Example SQL for BigQuery:

MERGE INTO [pdt_name] USING (SELECT [columns]
   WHERE created_at >= TIMESTAMP('4/28/21 12:00:00 AM'))
   AS tmp_name ON FALSE
WHEN NOT MATCHED BY SOURCE AND created_date >= TIMESTAMP('4/28/21 12:00:00 AM')
   THEN DELETE
WHEN NOT MATCHED THEN INSERT [columns]

## Example SQL for other dialects:

START TRANSACTION;
DELETE FROM [pdt_name]
   WHERE created_date >= TIMESTAMP('4/28/21 12:00:00 AM');
INSERT INTO [pdt_name]
   SELECT [columns]
   FROM [source_table]
   WHERE created_at >= TIMESTAMP('4/28/21 12:00:00 AM');
COMMIT;

示例 2

此示例使用了一个具有以下属性的 PDT:

  • 持久性策略:每天触发一次
  • 递增键:月
  • 增量偏移:0

此表格将于 6 月 1 日更新,具体如下:

  • 每日持久策略意味着表每天自动构建一次。我们将于 5 月 31 日添加表格中的最后一行。
  • 由于增量键基于月份,因此 PDT 构建器会在 5 月 31 日截断到月初,并重建 5 月到今天(包括 6 月 1 日)当天的所有数据。
  • 由于此 PDT 没有增量偏移,因此不会重新构建之前的任何时间段。

此表格将于 6 月 2 日更新,具体如下:

  • 我们将于 6 月 1 日添加表格中最后一行。
  • 由于 PDT 构建器会截断到 6 月初,然后使用从 6 月 1 日到当前日期的数据重新构建数据,因此系统仅会重新构建 6 月 1 日和 6 月 2 日的数据。
  • 由于此 PDT 没有增量偏移,因此不会重新构建之前的任何时间段。

示例 3

此示例使用了一个具有以下属性的 PDT:

  • 递增键:月
  • 增量偏移:3
  • 持久性策略:每天触发一次

此场景说明了增量 PDT 的设置不佳,因为它是每日触发 PDT 且偏移了三个月。也就是说,每天至少会重建三个月的数据,增量 PDT 的使用效率非常低下。不过,通过查看这种有趣的场景,您可以理解增量 PDT 的工作原理。

此表格将于 6 月 1 日更新,具体如下:

  • 每日持久策略意味着表每天自动构建一次。例如,表格中的最后一行已于 5 月 31 日添加。
  • 由于增量键基于月份,因此 PDT 构建器会在 5 月 31 日截断到月初,并重建 5 月到今天(包括 6 月 1 日)当天的所有数据。
  • 此外,此 PDT 的增量偏移为 3。这意味着 PDT 构建器还会重建 5 月之前三个时间段(月)的数据。结果是,系统会重新构建 2 月、3 月、4 月和 6 月 1 日的数据。

此表格将于 6 月 2 日更新,具体如下:

  • 我们将于 6 月 1 日添加表格中的最后一行。
  • PDT 构建器会将 6 月(包括 6 月 2 日)的数据截断到 6 月 1 日,然后重新构建。
  • 此外,由于增量偏移,PDT 构建器将在 6 月之前重建前三个月的数据。因此,从 4 月 4 月到 6 月 2 日当天的数据会重新构建。

在开发模式下测试增量 PDT

在将新的增量 PDT 部署到生产环境之前,您可以测试 PDT 以确保其构建和增量。如需在开发模式下测试增量 PDT,请执行以下操作:

  1. 为 PDT 创建“探索”:

    • 在关联的模型文件中,使用 include 参数在模型文件中添加 PDT 的视图文件。
    • 在同一模型文件中,使用 explore 参数为增量 PDT 视图创建“探索”。
     include: "/views/e_faa_pdt.view"
     explore: e_faa_pdt {}
    
  2. 打开“PDT”的“探索”。为此,请选择查看文件操作按钮,然后选择“探索”名称。

  1. 在“探索”版块中,选择一些维度或衡量指标,然后点击运行。然后,Looker 会构建整个 PDT。如果这是您在增量 PDT 上运行的第一个查询,则 PDT 构建器将构建整个 PDT 以获取初始数据。如果表较大,初始构建可能需要花费大量时间,就像构建任何大型表一样。

  2. 您可以验证初始 PDT 的构建方式如下:

    • 如果您拥有 see_logs 权限,可以通过查看 PDT 事件日志来验证表是构建的。如果您在 PDT 事件日志中未看到 PDT 创建事件,请查看 PDT 事件日志探索顶部的状态信息。如果其中显示“来自缓存”,您可以选择清除缓存和刷新来获取最新信息。
    • 否则,您可以在“探索”的数据栏的 SQL 标签页中查看这些评论。SQL 标签页会显示查询以及您在“探索”中运行查询时将执行的操作。例如,如果 SQL 标签页中的评论显示为 -- generate derived table e_incremental_pdt,当您点击运行时,系统将执行此操作。
  3. 创建 PDT 的初始 build 后,请使用“探索”中的 Rebuild Durived Tables & Run(重新构建派生表和运行)选项,提示增量构建 PDT。

  4. 您可以使用与之前相同的方法验证 PDT 是以增量方式构建的:

    • 如果您拥有 see_logs 权限,则可以使用 PDT 事件日志查看增量 PDT 的 create increment complete 事件。如果您在 PDT 事件日志中未看到此事件,并且查询状态为“来自缓存”,请选择清除缓存和刷新以获取最新信息。
    • 查看探索的数据栏的 SQL 标签页中的注释。在这种情况下,注释会指明 PDT 已递增。例如:-- increment persistent derived table e_incremental_pdt to generation 2
  5. 验证 PDT 已正确构建并递增后,如果您不想为 PDT 保留专用的“探索”,可以从模型文件中移除或注释掉 PDT 的 exploreinclude 参数。

在开发模式中构建 PDT 后,在您部署更改之后,此表将用于生产环境,除非您进一步更改表的定义。如需了解详情,请参阅 Looker 中的派生表文档页面中的在开发模式中保留的表部分。

适用于增量 PDT 的数据库方言

为了让 Looker 支持 Looker 项目中的增量 PDT,您的数据库方言必须支持支持删除和插入行的数据定义语言 (DDL) 命令。

下表显示了最新版 Looker 中支持增量 PDT 的方言: