Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
Apache spark 为什么相同的HashPartitioner应用于具有相同键的两个RDD上不';t等分_Apache Spark_Join_Rdd_Partitioning_Shuffle - Fatal编程技术网

Apache spark 为什么相同的HashPartitioner应用于具有相同键的两个RDD上不';t等分

Apache spark 为什么相同的HashPartitioner应用于具有相同键的两个RDD上不';t等分,apache-spark,join,rdd,partitioning,shuffle,Apache Spark,Join,Rdd,Partitioning,Shuffle,我有两个具有相同键和不同值的RDD。 我用相同的.partitionBy(partitioner) 然后我加入他们: val partitioner=newhashpartitioner(分区=4) val a=spark.sparkContext.makeRDD(Seq( (1,“A”)、(2,“B”)、(3,“C”)、(4,“D”)、(5,“E”)、(6,“F”)、(7,“G”)、(8,“H”) )).partitionBy(partitioner) val b=spark.sparkCon

我有两个具有相同键和不同值的RDD。 我用相同的
.partitionBy(partitioner)
然后我加入他们:

val partitioner=newhashpartitioner(分区=4)
val a=spark.sparkContext.makeRDD(Seq(
(1,“A”)、(2,“B”)、(3,“C”)、(4,“D”)、(5,“E”)、(6,“F”)、(7,“G”)、(8,“H”)
)).partitionBy(partitioner)
val b=spark.sparkContext.makeRDD(Seq(
(1,“a”)、(2,“b”)、(3,“c”)、(4,“d”)、(5,“e”)、(6,“f”)、(7,“g”)、(8,“h”)
)).partitionBy(partitioner)
println(“A:”)
a、 foreachPartition(p=>{
p、 foreach(t=>print(t+“”)
println()
})
println(“B:”)
b、 foreachPartition(p=>{
p、 foreach(t=>print(t+“”)
println()
})
println(“Join:”)
a、 联接(b,分区器)
.foreachPartition(p=>{
p、 foreach(t=>print(t+“”)
println()
})
我得到:

A:
(2,B) (3,C) (4,D) (6,F) (7,G) 
(8,H) (1,A) 
(5,E) 

B:
(3,c) (7,g) 
(1,a) (5,e) 
(2,b) (6,f) 
(4,d) (8,h) 

Join:
(6,(F,f)) (1,(A,a)) (2,(B,b)) (5,(E,e)) (4,(D,d)) (8,(H,h)) 
(3,(C,c)) (7,(G,g))

所以第一个问题是为什么A和B分区不同,为什么joinRDD与它们都不同?

分区在所有情况下都是完全相同的。问题在于你使用的方法。请记住,每个分区都是在单独的线程中处理的。如果多次运行此代码,您将看到输出实际上是不确定的

例如,请尝试以下方法:

a.glom.collect.map(u.mkString(“”).foreach(println)
(4,D)(8,H)
(1,A)(5,E)
(2,B)(6,F)
(3,C)(7,G)
b.glom.collect.map(u.mkString(“”).foreach(println)
(4,d)(8,h)
(1,a)(5,e)
(2,b)(6,f)
(3,c)(7,g)
a.join(b.glom.collect.map(uu.mkString(“”)).foreach(println)
(4,(D,D))(8,(H,H))
(1,(A,A))(5,(E,E))
(6,(F,F))(2,(B,B))
(3,(C,C))(7,(G,G))
请注意,如果在非
本地
上下文中执行,则每个分区中的值顺序仍然可能是不确定的,但每个分区的内容将与上面所示的相同