我有一个名为DStream[RawWeatherData]
的{{1}}对象。 parsedWeatherStream
类中的每个对象如下所示:
(“ 725030:14732”,2008,1,1 ,1,5.0,-3.3,1020.6,290,4.1,2,0.0, 0.2 ,0.0 )
以上对象的参数:RawWeatherData
这样的对象就是我将从Kafka进入Spark Streaming上下文的对象。
我的最终目标是为(wsid, year, month, day, hour, temperature, dewpoint, pressure, windDirection, windSpeed, skyCondition, oneHourPrecip, sixHourPrecip)
中所有对象的所有oneHourPrecip
值求和(在对象中以粗体突出显示),并有条件检查粗体值是否DStream
左侧,比较流中的两个对象时,是否相同。
为此,我能够从parsedStream中制作一个地图,只取出我需要的对象:
(wsid, year, month, day)
现在,我不确定应该使用哪种技术来总结所有val newStream = parsedWeatherStream.map { weather =>
(weather.wsid, weather.year, weather.month, weather.day, weather.oneHourPrecip)
}
值。我试图有条件地进行减少,但最终会导致错误:
oneHourPrecip
我也研究了// ERROR: Type mismatch
val transformedStream = newStream.reduce{(a , b) => {
if (a._1 == b._1 && a._2 == b._2 && a._3 == b._3 && a._4 == b._4)
(a._1 , a._2 , a._3 , a._4 , a._5 + b._5)
else
None //Would like to do Nothing here, so returning None
}}
操作,但这似乎也无济于事。
答案 0 :(得分:1)
对于上述问题中的newStream
对象,我做了一个小但细微的更改。我将我的键(这4个值)添加到了一个括号内,以将我的newStream
表示为键值对。然后,我要做的只是在上面reduceByKey
。
val newStream = parsedWeatherStream.map { weather =>
((weather.wsid, weather.year, weather.month, weather.day), weather.oneHourPrecip)
}.reduceByKey{(a , b) =>
a + b
}