Apache spark 如何计算Spark Streaming数据流中每个键或记录分组的平均值?

Apache spark 如何计算Spark Streaming数据流中每个键或记录分组的平均值?,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我对Spark Scala有个问题,我想计算数据流的平均值,我从kafka到数据流的数据如下 [(2110)、(2130)、(2120)、(3200)、(3206)、(3206)、(4150)、(4160)、(4170)] 我想这样数一数 [(2,(110+130+120)/3,(3,(200+206+206)/3,(4,(150+160+170)/3)] 然后得到这样的结果, [(2120)、(3204)、(4160)] 如何使用dstream中的scala实现这一点?我使用spark 1.6

我对Spark Scala有个问题,我想计算数据流的平均值,我从kafka到数据流的数据如下

[(2110)、(2130)、(2120)、(3200)、(3206)、(3206)、(4150)、(4160)、(4170)]

我想这样数一数

[(2,(110+130+120)/3,(3,(200+206+206)/3,(4,(150+160+170)/3)]

然后得到这样的结果,

[(2120)、(3204)、(4160)]

如何使用dstream中的scala实现这一点?我使用spark 1.6版

使用映射转换输入(x,y)-

[(2110)、(2130)、(2120)、(3200)、(3206)、(3206)、(4150)、(4160)、(4170)]

至(x,(y,1)

[(2,(110,1)),(2,(130,1)),(2,(120,1)),(3,(200,1)),(3,(206,1)),(3,(206,1)),(4,(150,1)),(4,(160,1),(4,(170,1))]

现在,通过编写一个reduce函数来使用redudceByKeyAndWindow,该函数将添加两条记录作为- (x,(y1,1))和(x,(y2,1))到(x,(y1+y2,1+1)

[(2,(360,3)),(3,(612,3)),(4,(480,3))]

现在再次运行地图以获取平均值- (x,(y1,y2))至(x,(y1/y2))

[(2120)、(3204)、(4160)]

使用映射转换输入(x,y)-

[(2110)、(2130)、(2120)、(3200)、(3206)、(3206)、(4150)、(4160)、(4170)]

至(x,(y,1)

[(2,(110,1)),(2,(130,1)),(2,(120,1)),(3,(200,1)),(3,(206,1)),(3,(206,1)),(4,(150,1)),(4,(160,1),(4,(170,1))]

现在,通过编写一个reduce函数来使用redudceByKeyAndWindow,该函数将添加两条记录作为- (x,(y1,1))和(x,(y2,1))到(x,(y1+y2,1+1)

[(2,(360,3)),(3,(612,3)),(4,(480,3))]

现在再次运行地图以获取平均值- (x,(y1,y2))至(x,(y1/y2))

[(2120)、(3204)、(4160)]


谢谢你。我这样使用val agg_rdd=rdd.aggregateByKey((0,0))((acc,value)=>(acc.\u 1+value,acc.\u 2+1),(acc1,acc2)=>(acc1.\u 1+acc2.\u 1,acc1.\u 2.\u 2))val sum=agg_rdd.mapValues(x=>(x.\u 1/x.\u 1/x.\u 2)和。谢谢。我这样使用val agg_rdd=d=>(acc1.\u 1+acc2.\u 1,acc1.\u 2+acc2.\u 2))val sum=agg_rdd.mapValues(x=>(x.\u 1/x.\u 2))sum.collect