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

Retain last row for given key in spark structured streaming

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

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

例如假设我有 table

key    | time   | value
----------------------------
A      | 1      | foo
B      | 2      | foobar
A      | 2      | bar
A      | 15     | foobeedoo

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

key    | time   | value
----------------------------
B      | 2      | foobar
A      | 15     | foobeedoo

我可能想加入另一个流。

最好不要浪费一个支持的聚合步骤。我想我需要一种具有相反顺序的 dropDuplicates() 函数。

请注意,这个问题明确地是关于结构化流以及如何在没有浪费聚合步骤的结构的情况下解决问题(因此,所有具有 window 函数或最大聚合的东西都不是一个好的答案)。 (如果您不知道:链接聚合现在 unsupported 在结构化流中。)

flatMapGroupsWithState函数中使用flatMapGroupsWithStatemapGroupsWithState,按键分组,并按时间对值进行排序,将最后一行存入GroupState