我有2个不同的分区器的rdds。
case class Person(name: String, age: Int, school: String)
case class School(name: String, address: String)
rdd1
是Person
的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应根据年龄进行分区。
答案 0 :(得分:1)
假设您有两个rdd,rdd1和rdd2并且想要应用连接操作。如果rdds已分区(分区已设置)。然后调用rdd3 = rdd1.join(rdd2)将通过rdd1进行rdd3分区。 rdd3将始终从rdd1获取散列分区(第一个父节点,即调用连接的节点)。