实时处理

已完成

流式处理表是一个 Delta 表,包括对流式处理和增量数据处理的支持。 与传统表不同,流式处理表旨在在数据到达时持续接受数据。 它通过管道中的流进行更新,对于必须持续引入或转换新数据的方案非常有用。

流式处理表对于数据引入特别有用,因为它们只处理每个输入行一次,这与大多数引入工作负荷匹配。 它们能够高效地处理大量仅追加数据。 它们对于低延迟转换也很有用,因为它们可以在行和时段内处理数据、管理大量输入以及以最少的延迟交付结果。

流式处理表的工作原理

更新流式处理表时,与其关联的流从流源读取新信息,并将其追加到表中。 该表在管道的源代码中定义,并且只有该管道有权更新该表。 如果在 Databricks SQL 中的管道外部创建了流式处理表,系统将自动生成隐藏管道来管理其更新。

实际上,多个流可以将数据追加到同一流式处理表。 从概念上讲,可以将流式处理表想象成 ETL 进程中持续提供新数据的中央目标。

创建流式处理表

在 SQL 中,可以使用 Lakeflow 声明性管道定义流式处理表,如下所示:

CREATE OR REFRESH STREAMING TABLE customers_bronze
AS SELECT * FROM STREAM read_files(
  "/volumes/path/to/files",
  format => "json"
);

仅追加行为

流式处理表旨在处理仅追加数据源。 将行追加到表后,即使定义表的查询发生更改,也不会重新处理该行。 例如,如果原始查询将名称转换为小写,稍后会将其修改为大写,则已追加的行将保留小写形式。 只有使用更新的逻辑处理更改后到达的新行。 如果需要使用新转换更新所有行,则必须触发管道的完全刷新。

低延迟流式处理

流式处理表通过检查点管理针对低延迟工作负荷进行优化。 使用边界流时,它们运行得最好。 当数据源具有明确的开始和结束时间(例如在初始批处理后未更新的文件目录)时,将发生自然边界流。 绑定流的另一种方法是应用水印。 Spark 结构化流中的水印指定系统在关闭时间窗口之前应等待延迟到达的数据的时间。 如果没有水印,未绑定的流可能会无限期地累积状态,从而导致内存压力导致的管道故障。

流快照联接

流式处理表还支持实时流与维度表的静态快照之间的联接。 在此方案中,维度表在流启动时被视为快照。 除非显式刷新维度表,否则流开始后对维度所做的任何更改不会反映在联接中。 在事实数据表与维度表相比非常大的情况下,此方法通常可以接受,并且可容忍一小部分差异。

流式处理表的限制

流式处理表具有以下限制:

  • 有限演变:更改查询仅影响新行;除非触发完全刷新,否则旧行保持不变。

  • 状态管理:需要绑定或水印流以避免故障。

  • 联接不会重新计算:维度表更改时联接不会更新。 对于始终正确的联接,请使用具体化视图。