Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 分区排序聚合EbyKey Spark_Scala_Apache Spark_Partitioning - Fatal编程技术网

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吗


很抱歉,我仍然不太明白它是如何工作的。

我将尝试回答您的问题:

  • 您不必显式地分配分区器。在您提供的代码中,Spark将自动分配它。如果RDD没有分区器,则使用默认的HashPartitioner。查看更多详细信息。要指定您自己的分区器,您应该使用另一个版本的
    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。谢谢