Apache spark 保留spark结构化流中给定密钥的最后一行

Apache spark 保留spark结构化流中给定密钥的最后一行,apache-spark,pyspark,spark-structured-streaming,Apache Spark,Pyspark,Spark Structured Streaming,与Kafka的日志压缩类似,有相当多的用例要求只保留给定密钥的最后一次更新,并使用结果来连接数据 如何在spark结构化流媒体中存档(最好使用PySpark) 例如,假设我有一张桌子 key | time | value ---------------------------- A | 1 | foo B | 2 | foobar A | 2 | bar A | 15 | foobeedoo 现在,我想将每

与Kafka的日志压缩类似,有相当多的用例要求只保留给定密钥的最后一次更新,并使用结果来连接数据

如何在spark结构化流媒体中存档(最好使用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()
函数


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

使用
flatMapGroupsWithState
mapGroupsWithState
,按键分组,并在
flatMapGroupsWithState
函数中按时间对值排序,将最后一行存储到
组状态

任何重复数据消除的可能重复都必须通过随机播放完成。你不会有蛋糕吃。删除重复项通过聚合工作,并保留任意对象。此外,如果我没有弄错的话,Kafka数据源的当前实现不知道Kafka分区键,因此无法将其纳入执行计划。我认为@user6910411给出了很好的答案。“只需要保留给定密钥的最后一次更新”您的问题本身表明您需要使用该密钥进行洗牌。有什么进展吗?这是一个很好的问题,没有什么意见。令人惊讶——至少对我来说是这样。嗨@zhicheng,官方医生在下面说。这是否意味着您提议的聚合结果不能用于加入<代码>从Spark 2.4开始,在联接之前不能使用其他非映射类操作。下面是一些不能使用的示例。无法在联接之前使用流聚合。在加入之前,不能在更新模式下使用mapGroupsWithState和flatMapGroupsWithState。或者您建议使用“完整”模式?您好@zhicheng,官方文档说,
只有在聚合和完整输出模式下,流式数据集才支持排序操作。
。您是如何进行排序的?如果您想加入使用flatMapGroupsWithState的数据帧,则输出模式应为“追加”。也许你误解了我的意思,我的意思是在flatMapGroupsWithState函数中使用排序。好的。我不明白您在updatestate函数中使用排序。顺便说一下,如果查询使用
flatmapGroupsWithState/mapGroupsWithState