spark 1.0.0 DStream.reduce表现不正常

时间:2014-10-22 05:50:21

标签: mapreduce streaming apache-spark

有没有人使用spark 1.0.0让DStream.reduce工作?

我有一些看似完全合理的代码。

  val word1 = messages.map {
    word =>
    val key = word
    (key, 1)
  }

val wordcount = word1.reduce(reduceCount)

private def reduceCount(count1: Int, count2: Int) : Int = {
   count1 + count2
}

reduce语句出现编译错误:类型不匹配; found:需要整数:(String,Int)

为什么会有此投诉? reduceCount应该只对int计数进行操作,reduce应该返回与word1相同的类型,即(String,int)。我尝试了很多变种来解决这个错误,但它似乎行为不正确。

如果你改为调用reduceByKeyAndWindow,那么就没有编译错误。

val wordcount = word1.reduceByKeyAndWindow(reduceCount, batchDuration)

1 个答案:

答案 0 :(得分:1)

操作DStream.reduce具有以下签名:

def reduce(reduceFunc: (T, T) => T): DStream[T]

从语义上讲,它采用流的2个元素的关联函数并生成一个元素。

鉴于messagesDstream是一个字符串流,在映射之后如下:

val word1 = messagesDstream.map {word => (word,1)}

word1的类型是Tuple2 [String,Int]。这意味着reduce应该使用带有签名的reduce函数:f(x:(String,Int), y:(String,Int)): (String, Int)。在问题中提供的代码中,reduce函数为f(x:Int, y:Int):Int

您希望在这种情况下使用Dstream.reduceByKey(_ + _)的操作,因为它会在按键分组值后应用reduce函数,这就是字数统计的内容。