与 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()
功能相反的顺序。请注意,这个问题是关于结构化流媒体以及如何在不浪费聚合步骤的构造的情况下解决问题的(因此,所有带有窗口函数或最大聚合的东西都不是一个好的答案)。 (如果您不知道:链式聚合现在是 unsupported 在结构化流中。)
最佳答案
使用 flatMapGroupsWithState
或 mapGroupsWithState
,按key分组,对flatMapGroupsWithState
中的值按时间排序函数,将最后一行存入 GroupState
.
关于apache-spark - 保留 Spark 结构化流中给定键的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50823468/