2014-10-26 61 views
0

如何在Spark/Spark Streaming中利用位於DStream內的普通Scala Map中的reduceByKey?Spark Streaming - 爲DStream中的地圖設計的reduceByKey

我有一個DStream[(String, Array[(String, List)])],我想reduceByKey功能應用到內部Array[(String, List)](加入所有的名單一起)

我能做到這一點在正常的火花被外界RDD轉換到正常陣列(避免SparkContext對象)的序列化錯誤,

然後運行一個foreach和應用sc.parallelize()到裏面Array[(String, List)]

但由於DSTREAM沒有任何直接轉換到正常陣列我不能申請sc.parallelize()的內部組件,因此沒有reduceByKey函數。

我對Spark和Spark Streaming(實際上是整個map-reduce概念)都很陌生,這可能不是正確的做法,所以如果有人可以建議更好的做法,請這樣做。

回答

0

這是一個老問題,所以希望你想通了這一點,但.... 爲了能夠在DSTREAM必須首先導入的StreamingContext執行reduceByKey ...操作:

import org.apache.spark.streaming.StreamingContext._ 

這提供了擴展DStream的隱式方法。 一旦你這樣做不僅可以進行股票reduceByKey你也可以用分時的功能,如:

reduceByKeyAndWindow((a: List, b: List) => (a ::: b), Seconds(30), Seconds(30)) 

這是非常有用的,如果你想要一個滑動窗口內完成聚合。 希望有所幫助!