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

标签 apache-spark pyspark 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()功能相反的顺序。

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

最佳答案

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

关于apache-spark - 保留 Spark 结构化流中给定键的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50823468/

相关文章:

scala - 使用 Spark Scala 进行间隔合并

java - 将带有各种定界符的 Spark CSV 放入数据集中

Pyspark 数据帧计数花费的时间太长

apache-spark - 如何在 Apache Spark 中进行 LabelEncoding 或分类值

python - 如何使用 pyspark 收集两个连续日期之间的新 ID 列表

python - 如何将 Spark 数据帧行拆分为列?

apache-spark - 使用控制台输出格式显示 Spark 流批处理的完整结果

apache-spark - Spark 结构化流式传输具有独特消息模式的多个 Kafka 主题

scala - Spark 流 |将不同的数据帧写入Synapse DW中的多个表

apache-spark - pyspark:isin 与加入