2016-02-26 125 views
1

我想改变第一个DStream成为第二个使用spark。但我不知道该怎么做?我已经尝试了groupByKey(),它没有工作,aggregateByKey()只使用RDD而不是DStream。如何使用相同的密钥组合一个DStream密钥和值对?

这是当前结果:

DStream [(1,value1),(2,value2),(3,value3),(1,value4),(1,value5),(2,value6)] 

这是结果,我想:

DStream(1,(value1,value4,value5)) ,(2,(value2,value5)) ,(3,(value3)) 

感谢您的答复。

+1

你是什么意思'groupByKey' _didn't work_? – zero323

+0

使用与groupByKey相同的键在组合它们时不会给我相同的键和值对。这意味着它不会给我这个结果:DStream(1,(value1,value4,value5)),(2,(value2,value5)),(3,(value3))。我不知道如何做到这一点,也许我使用groupByKey错误? – peter

回答

2

groupByKey完全是这样。它将DStream[K, V]转换为DStream[(K, Seq[V])]。我怀疑你对产出的期望可能是错误的。由于DStream只是RDDs的一个无限序列,因此组将分别应用于每个RDD。所以,如果第一批包含:

(1,value1),(2,value2),(3,value3),(1,value4) 

和第二

(1,value5),(2,value6) 

你会得到

(1, [value1, value4]), (2, [value2]), (3, value3) 

(1,[value5]),(2,[value6]) 

分别。

虽然DStreams支持有状态操作(updateStateByKey),但您不希望将其用于增长集合。

+0

感谢您的解释。使用groupByKey不允许我组合相同的密钥对,因为它是一个流,并使用多个RDD /增长集合。你提出了什么解决方案来达到上述结果?谢谢 – peter

+1

我不清楚你想达到什么目的。我的意思是说,不断增长的价值观只会迟早打击记忆。如果你想保持一切都坚持下去(也许在需要的时候阅读)。如果你看更宽的间隔尝试窗口操作。 – zero323

+0

我不确定spark数据流可以处理什么数据量以及何时用数据库分析替换流。这里是我更详细的问题:http://stackoverflow.com/questions/35691172/whats-the-limit-to-spark-streaming-in-terms-of-data-amount。感谢您的回复和帮助! – peter

相关问题