sc.parallelize(Array(("red", "zero"), ("yellow", "one"), ("red", "two"))).groupByKey().collect.foreach(println)
(red,CompactBuffer(zero, two))
(yellow,CompactBuffer(one))
实现red 聚合[zero,two],yellow聚合[one]。但是groupbykey涉及大量的节点间数据传输。在数据量较大的情况下,有性能损失。
解决方法:
可以考虑使用reduceByKey.但由于value值类型为string,和传统数字求和不同(直接reduceByKey(+))。
为了保证value值可以“相加”,故先List化,然后使用:::List追加运算符(scala),即map(t=>( t.1,List(t.2))).reduceByKey(:::).
结果如下:
sc.parallelize(Array(("red", "zero"), ("yellow", "one"), ("red", "two")))
.map(t => (t._1,List(t._2)))
.reduceByKey(_:::_)
.collect()
同样可以实现相同效果
Array[(String, List[String])] = Array((red,List(zero, two)), (yellow,List(one)))
https://stackoverflow.com/questions/37580303/using-reducebykey-to-group-list-of-values/56574867#56574867
https://www.cnblogs.com/zzhangyuhang/p/9001523.html