使用reducebykey对值列表进行分组

bkkx9g8r  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(268)

我想对每个键的值列表进行分组,并执行如下操作:

sc.parallelize(Array(("red", "zero"), ("yellow", "one"), ("red", "two"))).groupByKey().collect.foreach(println)

(red,CompactBuffer(zero, two))
(yellow,CompactBuffer(one))

但我注意到databricks的一篇博文,它建议不要对大型数据集使用groupbykey。
避免groupbykey
有没有一种方法可以使用reducebykey获得相同的结果?
我试过这个,但是它连接了所有的值。顺便说一下,在我的例子中,键和值都是字符串类型。

sc.parallelize(Array(("red", "zero"), ("yellow", "one"), ("red", "two"))).reduceByKey(_ ++ _).collect.foreach(println)

(red,zerotwo)
(yellow,one)
xyhw6mcr

xyhw6mcr1#

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)))
polhcujo

polhcujo2#

使用 aggregateByKey :

sc.parallelize(Array(("red", "zero"), ("yellow", "one"), ("red", "two")))
.aggregateByKey(ListBuffer.empty[String])(
        (numList, num) => {numList += num; numList},
         (numList1, numList2) => {numList1.appendAll(numList2); numList1})
.mapValues(_.toList)
.collect()

scala> Array[(String, List[String])] = Array((yellow,List(one)), (red,List(zero, two)))

有关详细信息,请参阅此答案 aggregateByKey ,这是使用可变数据集背后的基本原理的链接 ListBuffer .
编辑: Is there a way to achieve the same result using reduceByKey? 以上事实上性能更差,详情请参见@zero323的评论。

相关问题