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

时间:2018-06-12 18:20:49

标签: apache-spark pyspark spark-structured-streaming

与Kafka的日志压缩类似,有很多用例需要仅保留给定密钥的最后更新,并使用结果作为连接数据的示例。

如何在火花结构流媒体中存档(最好使用PySpark)?

例如,假设我有表

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。)

1 个答案:

答案 0 :(得分:0)

使用flatMapGroupsWithStatemapGroupsWithState,按键分组,然后在flatMapGroupsWithState函数中按时间对值进行排序,将最后一行存储到GroupState中。