本页介绍使用 AUTO CDC 和 AUTO CDC FROM SNAPSHOT 目标表的高级主题,包括 DML 操作、读取更改数据馈送和监视处理指标。 有关 AUTO CDC API 接口的简介,请参阅 AUTO CDC API 接口:使用管道简化变更数据捕获。
在目标流式处理表中添加、更改或删除数据
如果管道将表发布到 Unity 目录,则可以使用 数据作语言 (DML)语句(包括插入、更新、删除和合并语句)修改由 AUTO CDC ... INTO 语句创建的目标流式处理表。
注释
- 不支持用于修改流式处理表的表架构的 DML 语句。 确保 DML 语句不会尝试修改表架构。
- 只能在使用 Databricks Runtime 13.3 LTS 及更高版本的 Unity Catalog 共享群集或 SQL 仓库中运行用于更新流式表的 DML 语句。
- 由于流式传输要求仅追加数据源,因此如果你的处理需要从包含更改的源流式传输表进行流式传输(例如,通过 DML 语句),请在读取源流式传输表时设置 skipChangeCommits 标志。 设置
skipChangeCommits后,将会忽略删除或修改源表上记录的事务。 如果你的处理不需要某个流式处理表,则可使用具体化视图(没有“仅追加”限制)作为目标表。
由于 Lakeflow Spark 声明性管道使用指定的SEQUENCE BY列并将适当的排序值传播到目标表的__START_AT和__END_AT列(对于 SCD 类型 2),因此必须确保 DML 语句使用这些列的有效值来维护记录的正确顺序。 请参阅 AUTO CDC 的工作原理。
有关对流式处理表使用 DML 语句的详细信息,请参阅 在流式处理表中添加、更改或删除数据。
以下示例插入一个活动记录,其起始序列为 5:
INSERT INTO my_streaming_table (id, name, __START_AT, __END_AT) VALUES (123, 'John Doe', 5, NULL);
小窍门
如果需要重命名目标表中 SCD 类型 2 的 __START_AT 和 __END_AT 列(例如,若要匹配下游架构要求),请基于目标表创建视图:
CREATE VIEW my_employees_view AS
SELECT
*,
__START_AT AS valid_from,
__END_AT AS valid_to
FROM my_scd2_target_table;
从 AUTO CDC 目标表读取变更数据馈送
在 Databricks Runtime 15.2 及以上版本中,你可以从作为 AUTO CDC 或 AUTO CDC FROM SNAPSHOT 查询目标的流式处理表中读取更改数据馈送,方式与从其他 Delta 表读取更改数据馈送相同。 从目标流式处理表读取更改数据馈送需要满足以下条件:
- 目标流式处理表必须发布到 Unity Catalog。 请参阅 将 Unity Catalog 与管道结合使用。
- 为了从目标流式处理表中读取变更数据流,您必须使用 Databricks Runtime 15.2 或更高版本。 若要读取其他管道中的更改数据馈送,必须将管道配置为使用 Databricks Runtime 15.2 或更高版本。
从在 Lakeflow Spark 声明性管道中创建的目标流式处理表读取更改数据馈送的方式与从其他 Delta 表读取更改数据馈送的方式相同。 若要详细了解如何使用 Delta 更改数据馈送功能,包括 Python 和 SQL 中的示例,请参阅 在 Azure Databricks 上使用 Delta Lake 更改数据馈送。
注释
更改数据馈送记录包括标识更改事件的类型的 元数据 。 在表中更新记录时,关联更改记录的元数据通常包括 _change_type 值,以及设置为 update_preimage 和 update_postimage 的事件。
但是,如果对目标流表进行更新并包含更改主键值,则这些 _change_type 值会有所不同。 更改包括对主键的更新时,元数据 _change_type 字段将设置为 insert 和 delete 事件。 在对具有 UPDATE 或 MERGE 语句的某个键字段进行手动更新时,或对于 SCD 类型 2 表,当 __start_at 字段更改以反映较早的起始序列值时,主键可能会发生更改。
查询 AUTO CDC 用于确定主键值,而在确定这些主键值的方法上,SCD 类型 1 和 SCD 类型 2 的处理是不同的。
| SCD 类型 | 主密钥 |
|---|---|
| SCD 类型 1 和管道 Python 接口 | 主键是create_auto_cdc_flow()函数中keys参数的值。 对于 SQL 接口,主键是由KEYS语句中的AUTO CDC ... INTO子句定义的列。 |
| SCD 类型 2 | 主键由 keys 参数或 KEYS 子句和操作的 coalesce(__START_AT, __END_AT) 返回值组成,其中 __START_AT 和 __END_AT 是目标流式处理表中的相应列。 |
获取有关管道中 CDC 查询处理的记录的数据
注释
以下指标仅由 AUTO CDC 查询捕获,而不是由 AUTO CDC FROM SNAPSHOT 查询捕获。
以下指标由 AUTO CDC 查询捕获:
-
num_upserted_rows:更新期间插入数据集的输出行数。 -
num_deleted_rows:更新期间从数据集中删除的现有输出行数。
对于 num_output_rows 查询,不会捕获 AUTO CDC 非 CDC 流的指标(输出)。
哪些数据对象用于管道中的 CDC 处理?
在 Hive 元存储中声明目标表时,会创建两个数据结构:
- 一个使用分配给目标表的名称的视图。
- 管道用于管理 CDC 处理的内部后盾表。 此表通过追加
__apply_changes_storage_到目标表名称进行命名。
例如,如果声明名为 dp_cdc_target的目标表,则会看到一个命名 dp_cdc_target 视图和元存储中命名 __apply_changes_storage_dp_cdc_target 的表。 查询视图以访问已处理的数据。 请勿直接修改后盾表。
注释
这些数据结构仅适用于 AUTO CDC 处理,不适用于 AUTO CDC FROM SNAPSHOT 处理。 它们也仅适用于 Hive Metastore,而不适用于 Unity Catalog。