gpt4 book ai didi

scala - 使用 ReduceByKey 对值列表进行分组

转载 作者:可可西里 更新时间:2023-11-01 16:44:48 27 4
gpt4 key购买 nike

我想对每个键的值列表进行分组,并且正在做这样的事情:

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

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

但我注意到 Databricks 的一篇博客文章,它建议不要对大型数据集使用 groupByKey。

Avoid GroupByKey

有没有办法使用 reduceByKey 达到相同的结果?

我试过了,但它连接了所有值。顺便说一下,对于我的情况,键和值都是字符串类型。

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

(red,zerotwo)
(yellow,one)

最佳答案

使用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)))

参见 this answer有关 aggregateByKey 的详细信息,this link了解使用可变数据集 ListBuffer 的基本原理。

编辑:

有没有办法使用 reduceByKey 实现相同的结果?

上面的其实性能更差,详情请看@zero323的评论。

关于scala - 使用 ReduceByKey 对值列表进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37580303/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com