如何在Spark / Spark Streaming中使用reduceByKey作为驻留在DStream中的普通Scala Map?
我有一个DStream[(String, Array[(String, List)])]
,我想将reduceByKey
函数应用于内部Array[(String, List)]
(将所有列表连接在一起)
我可以通过将外部RDD转换为普通数组(以避免SparkContext对象上的序列化错误)在普通Spark中执行此操作,
然后运行foreach并将sc.parallelize()
应用于内部Array[(String, List)]
但由于DStream没有直接转换为普通数组,因此我无法将sc.parallelize()
应用于内部组件,因此没有reduceByKey
函数。
我是Spark和Spark Streaming的新手(实际上是整个map-reduce概念),这可能不是正确的方法,所以如果有人可以建议更好的做法,请这样做。
答案 0 :(得分:0)
这是一个古老的问题,所以希望你能想到这一点,但.... 为了能够在DStream上执行reduceByKey ...操作,您必须首先导入StreamingContext:
import org.apache.spark.streaming.StreamingContext._
这提供了扩展DStream的隐式方法。 完成此操作后,您不仅可以执行stock reduceByKey,还可以使用时间切片功能,如:
reduceByKeyAndWindow((a: List, b: List) => (a ::: b), Seconds(30), Seconds(30))
如果您想在滑动窗口中进行聚合,这些非常有用。 希望有所帮助!