Apache Spark:使用不同的分区

时间:2016-05-05 13:19:40

标签: join apache-spark partitioning shuffle rdd

我有2个不同的分区器的rdds。

case class Person(name: String, age: Int, school: String)
case class School(name: String, address: String)

rdd1Person的RDD,我根据此人的age对其进行了分区,然后将密钥转换为school

val rdd1: RDD[Person] = rdd1.keyBy(person => (person.age, person))
                            .partitionBy(new HashPartitioner(10))
                            .mapPartitions(persons => 
                                 persons.map{case(age,person) => 
                                    (person.school, person)
                            })

rdd2是由School学校分组的name的RDD。

val rdd2: RDD[School] = rdd2.groupBy(_.name)

现在,rdd1根据人的年龄进行分区,因此所有年龄相同的人都会进入相同的分区。并且,rdd2根据学校的名称进行分区(默认情况下)。

我希望rdd1.leftOuterJoin(rdd2)rdd1不会被洗牌,因为rdd1与rdd2相比非常大。另外,我将结果输出到Cassandra,它在age上进行了分区,因此rdd1的当前分区将加快后续写入的过程。

有没有办法加入两个RDD而没有: 1.改组rdd1和 2.广播'rdd2',因为rdd2大于可用内存。

注意:加入的rdd应根据年龄进行分区。

1 个答案:

答案 0 :(得分:1)

假设您有两个rdd,rdd1和rdd2并且想要应用连接操作。如果rdds已分区(分区已设置)。然后调用rdd3 = rdd1.join(rdd2)将通过rdd1进行rdd3分区。 rdd3将始终从rdd1获取散列分区(第一个父节点,即调用连接的节点)。