保留 Spark 结构化流中给定键的最后一行

Thi*_*ilo 5 apache-spark pyspark spark-structured-streaming

与 Kafka 的日志压缩类似,有很多用例需要仅保留给定键的最后更新,并将结果用于例如连接数据。

如何将其存档在 spark 结构化流中(最好使用 PySpark)?

例如假设我有桌子

key    | time   | value
----------------------------
A      | 1      | foo
B      | 2      | foobar
A      | 2      | bar
A      | 15     | foobeedoo
Run Code Online (Sandbox Code Playgroud)

现在我想保留每个键的最后一个值作为状态(带水印),即有权访问数据帧

key    | time   | value
----------------------------
B      | 2      | foobar
A      | 15     | foobeedoo
Run Code Online (Sandbox Code Playgroud)

我可能想加入另一个流。

优选地,这应该在不浪费一个支持的聚合步骤的情况下完成。我想我需要一种dropDuplicates()反向顺序的函数。

请注意,这个问题是关于结构化流媒体以及如何在不浪费聚合步骤的构造的情况下解决问题的(因此,所有带有窗口函数或最大聚合的东西都不是一个好的答案)。(如果您不知道:结构化流媒体现在不支持链式聚合。)

zhi*_*eng 0

使用flatMapGroupsWithStateor mapGroupsWithState,按键分组,并按函数中的时间对值进行排序flatMapGroupsWithState,将最后一行存储到GroupState.