这是我的情况:我从不同的设备接收数据,这些设备有自己的签名,时间戳和标志。然后,我使用(flag==SAVE_VALUE)
函数过滤文件中的foreachRDD
,但前提是它通过了这个条件:
(it is the first time I receive this signature)
OR
(I already have this signature && the timestamp is older than an hour)
直到我在本地环境中,这对我来说意味着使用Map,我在那里存储了所有ID和最后收到的时间戳。现在我想把这个逻辑放在Spark中。我应该怎么做? 我觉得这是有状态Dstream的情况,但我无法完全理解:
答案 0 :(得分:1)
看看mapWithState()
,这正是你想要的。
在StateSpecFunction
中,只要新值到达同一个密钥,您就可以确定是要更新,保留还是删除当前状态。您可以访问当前状态和新状态,因此您可以在两者之间进行任何类型的比较。
它还内置了对超时的支持,可以分区为多个执行程序。
您可以通过在stateSnapshots()
的返回值上调用mapWithState()
来访问全局地图。否则,返回值将由每批StateSpecFunction
的返回值决定。
mapWithState()
,之前有一个名为updateStateByKey()
的类似函数,它大致相同,但在较大的数据集上表现更差。