如何计算Spark Streaming DStream中每个键或记录分组的平均值?

时间:2018-09-08 02:45:09

标签: apache-spark spark-streaming

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版

1 个答案:

答案 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)]