首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在分区数据上运行groupByKey/ reduceBuKey,但使用不同的键

在分区数据上运行groupByKey/ reduceBuKey,但使用不同的键
EN

Stack Overflow用户
提问于 2017-01-13 08:07:13
回答 1查看 971关注 0票数 3

我有一个((id, ts), some value)类型的排序RDD。仅在id字段上使用自定义分区器对此进行分区。

代码语言:javascript
代码运行次数:0
运行
复制
math.abs(id.hashCode % numPartitions)

现在,如果我在这个分区的RDD上运行以下两个函数,它会涉及数据集的洗牌和重新分区吗?

代码语言:javascript
代码运行次数:0
运行
复制
val partitionedRDD: ((id:Long, ts:Long), val:String) = <Some Function>
val flatRDD = orderedRDD.map(_ => (_._1.id, (_._1.ts, _._2)))

我想知道的是,flatRDD.groupByKey()flatRDD.reduceByKey()是否将具有与partitionedRDD或Spark相同的分区,并重新洗牌数据集并创建新的分区?

谢谢你,德维

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-13 09:44:57

是的,在groupByKeyreduceByKey上执行flatRDD必然会导致另一次洗牌。

因为您知道flatRDD已经被id分区了,所以您可以安全地假设具有相同id的所有记录都驻留在一个分区中。因此,如果您想要groupBy(id),您可以使用mapPartitions (与preservesPartitioning = true一起)并分别对每个分区执行该操作,从而防止Spark对您的数据进行洗牌:

代码语言:javascript
代码运行次数:0
运行
复制
flatRDD.mapPartitions({ it =>
  it.toList
    .groupBy(_._1).mapValues(_.size) // some grouping + reducing the result
    .iterator

}, preservesPartitioning = true)

这不会引起额外的洗牌:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41629953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档