DStream上的条件缩减

时间:2019-05-07 09:05:14

标签: scala apache-spark apache-kafka

我有一个名为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 }} 操作,但这似乎也无济于事。

1 个答案:

答案 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
}