Scala 分区排序聚合EbyKey Spark
因此,如果我之前有一个转换:Scala 分区排序聚合EbyKey Spark,scala,apache-spark,partitioning,Scala,Apache Spark,Partitioning,因此,如果我之前有一个转换: myRDD = someRDD.map() mySecondRDD = myRDD.aggregateByKey(initValue)(CombOp , MergeOp) 在这一点上,myRDD没有分区器,但是mySecondRDD有一个hashPartitioner。 首先,我想问: 1) 我必须在myRDD中指定一个分区人吗?如果我这样做了,怎么可能在aggregateByKey中将其作为参数传递 *请注意,myRDD是一个转换,没有分区器 2) 在这两个命
myRDD = someRDD.map()
mySecondRDD = myRDD.aggregateByKey(initValue)(CombOp , MergeOp)
在这一点上,myRDD没有分区器,但是mySecondRDD有一个hashPartitioner。
首先,我想问:
1) 我必须在myRDD中指定一个分区人吗?如果我这样做了,怎么可能在aggregateByKey中将其作为参数传递
*请注意,myRDD是一个转换,没有分区器
2) 在这两个命令的末尾,myRDD是否应该具有与mySecondRDD相同的分区器,而不是无分区器
3) 这两个命令可以执行多少次洗牌
4) 如果我在myRDD中使用partitionBy指定一个partitioner,并将其作为aggregateByKey中的参数传递,我会将洗牌次数减少到1而不是2吗
很抱歉,我仍然不太明白它是如何工作的。我将尝试回答您的问题:
aggregateByKey()
,它接受分区器和初始值。它看起来像myRdd.aggregateByKey(initialValue,partitioner)(CombOp,MergeOp)myRDD
已经有一个分区器,而您没有在aggregateByKey()中明确指定新的分区器,则您的myseconddd
将使用myRDD
中的分区器
map()
转换不会触发洗牌操作,因此只有1个洗牌操作。相反,aggregateByKey()
需要在一台机器上找到具有相同密钥的记录谢谢你的回答,但我仍然有一些问题:1)你说:你只有一个洗牌操作,因为map()转换不会触发它。是的,但是必须首先计算将触发“操作”的AggregateByKey,map()!因为GATEGATEBYKEY步进了这个分区。是的,但是map()会进行洗牌(它不会保留关键点)。这是一个来自map()的洗牌,一个来自AggregateByKey,对吗?@Spartan我不确定我是否正确理解了你的评论。您能从Spark UI提供阶段的DAG吗?它会告诉我们你有多少次洗牌。我仍然相信
map()
是一对一的转换,不需要洗牌。你可以找到哪些转换导致了混乱。好吧,我想知道Spark是如何工作的。从我读到的内容来看,(key,Value)RDD中的map()不保留键,也不保留分区!这意味着它会重新划分数据,对吗?但重新划分意味着洗牌!那么map()是一个shuffle和aggregateByKey吗?你也可以在这里检查我的新问题:()。我还试图理解为什么RDD中的map()或mapValues()后面有partition=none。谢谢