Spark Scala出现问题,我想从dstream数据中计算平均值,这样就从kafka到dstream获取数据,
[(2,110),(2,130),(2,120),(3,200),(3,206),(3,206),(4,150),(4,160),(4,170)]
我想这样数他们
[(2,(110 + 130 + 120)/ 3),(3,(200 + 206 + 206)/ 3),(4,(150 + 160 + 170)/ 3)]
然后,得到这样的结果
[(2,120),(3,204),(4,160)]
如何使用dstream中的scala做到这一点?我使用的是Spark 1.6版
答案 0 :(得分:2)
使用地图转换输入(x,y)-
[(2,110),(2,130),(2,120),(3,200),(3,206),(3,206),(4,150),(4,160),(4,170)]
到(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))to(x,(y1 / y2))
[(2,120),(3,204),(4,160)]