join - spark - scala rdd map
Apache Spark: une dos RDD con diferentes particionadores (1)
Tengo 2 rdds con diferentes conjuntos de particiones.
case class Person(name: String, age: Int, school: String)
case class School(name: String, address: String)
rdd1
es el RDD de Person
, que he dividido según la age
de la persona, y luego convertí la clave a la 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
es el RDD de la School
agrupada por name
de la escuela.
val rdd2: RDD[School] = rdd2.groupBy(_.name)
Ahora, rdd1
está dividido en función de la edad de la persona, por lo que todas las personas con la misma edad van a las mismas particiones. Y, rdd2
está particionado (por defecto) en función del nombre de la escuela.
Quiero rdd1.leftOuterJoin(rdd2)
de tal forma que rdd1
no se mezcle porque rdd1 es muy grande en comparación con rdd2. Además, estoy enviando el resultado a Cassandra, que está particionado por age
, por lo que la partición actual de rdd1
el proceso de escritura posterior.
¿Hay alguna manera de unir dos RDD sin: 1. rdd1
y 2. Transmitir ''rdd2'', porque rdd2
es más grande que la memoria disponible.
Nota: El rdd unido debe dividirse según la edad.
Supongamos que tiene dos rdds, rdd1 y rdd2 y desea aplicar la operación de unión. y si rdds tiene particiones (la partición está configurada). luego, llamar a rdd3 = rdd1.join (rdd2) hará que la partición rdd3 sea rdd1. rdd3 siempre tomará la partición hash de rdd1 (primer padre, el que se invocó a la combinación).