在 Looker 中,永久性派生表 (PDT) 会写入数据库的临时架构。Looker 会基于其持久化策略保留并重新构建 PDT。当 PDT 被触发以重新构建时,默认情况下,Looker 会重新构建整个表。
增量 PDT 是 Looker 通过将新数据附加到表而不是完整地重新构建表来构建的 PDT:
如果您的方言支持增量 PDT,您可以将以下类型的 PDT 转换为增量 PDT:
- 汇总表格
- 基于 LookML(原生)的 PDT
- 基于 SQL 的 PDT
首次针对增量 PDT 运行查询时,Looker 会构建整个 PDT 来获取初始数据。如果表较大,初始构建可能需要花费大量时间,就像构建任何大型表一样。构建初始表后,后续构建将逐步完成,且在策略性地设置增量 PDT 所需的时间会更短。
对于增量 PDT,请注意以下事项:
- 只有使用基于触发器的保留策略(
datagroup_trigger
、sql_trigger_value
或interval_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_key
和 increment_offset
设置与 PDT 的持久性策略无关:
- 仅当 PDT 递增时,增量 PDT 的持久化策略才会确定。除非触发表的持久策略,或者 PDT 使用“探索”部分的重新构建派生表和运行选项手动触发 PDT,否则 PDT 构建器不会修改增量 PDT。
- 当 PDT 递增时,PDT 构建器将根据最新时间增量(由
increment_key
参数定义的时间段)来确定上次向表添加最新数据的时间。在此基础上,PDT 构建器会将数据截断为表中最近时间增量的开头,然后从那里构建最新的增量。 - 如果 PDT 具有
increment_offset
参数,则 PDT 构建器还会重新构建increment_offset
参数中指定的先前时间段的数量。上一个时间段是从最近递增时间(由increment_key
参数定义的时间段)开始算起。
以下示例场景展示了如何通过显示 increment_key
、increment_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,请执行以下操作:
为 PDT 创建“探索”:
include: "/views/e_faa_pdt.view" explore: e_faa_pdt {}
打开“PDT”的“探索”。为此,请选择查看文件操作按钮,然后选择“探索”名称。
在“探索”版块中,选择一些维度或衡量指标,然后点击运行。然后,Looker 会构建整个 PDT。如果这是您在增量 PDT 上运行的第一个查询,则 PDT 构建器将构建整个 PDT 以获取初始数据。如果表较大,初始构建可能需要花费大量时间,就像构建任何大型表一样。
您可以验证初始 PDT 的构建方式如下:
创建 PDT 的初始 build 后,请使用“探索”中的 Rebuild Durived Tables & Run(重新构建派生表和运行)选项,提示增量构建 PDT。
您可以使用与之前相同的方法验证 PDT 是以增量方式构建的:
验证 PDT 已正确构建并递增后,如果您不想为 PDT 保留专用的“探索”,可以从模型文件中移除或注释掉 PDT 的
explore
和include
参数。
在开发模式中构建 PDT 后,在您部署更改之后,此表将用于生产环境,除非您进一步更改表的定义。如需了解详情,请参阅 Looker 中的派生表文档页面中的在开发模式中保留的表部分。
适用于增量 PDT 的数据库方言
为了让 Looker 支持 Looker 项目中的增量 PDT,您的数据库方言必须支持支持删除和插入行的数据定义语言 (DDL) 命令。
下表显示了最新版 Looker 中支持增量 PDT 的方言: