首页 > 解决方案 > Apache spark 结构化流 2.3.0 如何让接收器知道新行是对现有行的更新?

问题描述

在更新模式下运行时,火花结构化流如何让接收器知道新行是对现有行的更新?它是查看新行的所有列的所有值和现有行的相等匹配还是计算某种哈希?

标签: apache-sparkspark-streamingspark-structured-streaming

解决方案


阅读文档,我们看到一些关于更新模式的有趣信息(我添加的粗体格式):

更新模式 - 只有自上次触发后在结果表中更新的行才会写入外部存储(自 Spark 2.1.1 起可用)。请注意,这与 Complete Mode 的不同之处在于,此模式仅输出自上次触发以来已更改的行。如果查询不包含聚合,则相当于 Append 模式

因此,要使用更新模式,需要进行某种聚合,否则所有数据都将简单地添加到结果表的末尾。反过来,要使用聚合,数据需要使用一个或多个列作为键。由于需要一个键,因此很容易知道一行是否已更新 - 只需将值与表的前一次迭代进行比较(键告诉您要与哪一行进行比较)。在包含 a 的聚合中groupby,被分组的列是键。

返回单个值的简单聚合不需要键。但是,由于只返回一个值,如果该值发生更改,它将更新。这里的一个例子可能是对一列求和(没有 groupby)。

该文档包含一张可以很好理解这一点的图片,请参阅上面链接中的“快速示例模型”。


推荐阅读