有没有人使用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)
答案 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函数,这就是字数统计的内容。