Mapreduce spark 1.0.0 DStream.reduce运行不正常
是否有人使用spark 1.0.0获得DStream.reduce工作 我有一些代码看起来非常合理Mapreduce spark 1.0.0 DStream.reduce运行不正常,mapreduce,streaming,apache-spark,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 + coun
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语句得到一个编译错误:类型不匹配;找到:必需整数:(字符串,Int)
为什么会有这样的抱怨?reduceCount应该只对int计数进行操作,reduce应该返回与word1相同的类型,即(String,int)。我尝试了很多变化来绕过这个错误,但它似乎表现得不正确
如果改为调用ReduceByAndWindow,则不存在编译错误
val wordcount = word1.reduceByKeyAndWindow(reduceCount, batchDuration)
操作
DStream.reduce
具有以下特征:
def reduce(reduceFunc: (T, T) => T): DStream[T]
语义上,它接受流中两个元素的关联函数,并生成一个元素
给定的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函数,这就是字数计数的含义。嘿,你领先我了。我刚刚意识到正确的调用是reduceByKey()。我错了,没有发现这个函数是昨天调用的。@ USE105811。如果你考虑回答的问题,考虑接受答案。@ USER 105811P:我知道你从来没有接受过一个你之前问过的问题。这是社区动态和礼仪的一部分,接受你认为正确答案的问题。有些人甚至会在看到你的记录后拒绝回答你的问题。我不得不用谷歌搜索如何接受答案。我投了赞成票,但仍然必须明确接受,这似乎是多余的。