apache spark - significado - ¿Qué operaciones preservan el orden RDD?
rdd significado (1)
RDD tiene un orden
significativo
(a diferencia de algún orden aleatorio impuesto por el modelo de almacenamiento) si fue procesado por
sortBy()
, como se explica en esta
reply
.
Ahora, ¿qué operaciones preservan ese orden?
Por ejemplo, ¿se
garantiza
que (después de
a.sortBy()
)
a.map(f).zip(a) ===
a.map(x => (f(x),x))
Qué tal si
a.filter(f).map(g) ===
a.map(x => (x,g(x))).filter(f(_._1)).map(_._2)
qué pasa
a.filter(f).flatMap(g) ===
a.flatMap(x => g(x).map((x,_))).filter(f(_._1)).map(_._2)
Aquí "igualdad"
===
se entiende como "equivalencia funcional", es decir, no hay forma de distinguir el resultado utilizando operaciones a nivel de usuario (es decir, sin leer los registros & c).
Todas las operaciones conservan el orden, excepto las que no lo hacen explícitamente.
Ordenar siempre es "significativo", no solo después de un
sortBy
.
Por ejemplo, si lee un archivo (
sc.textFile
), las líneas del RDD estarán en el orden en que estaban en el archivo.
Sin intentar dar una lista completa,
map
,
filter
,
flatMap
y
coalesce
(with
shuffle=false
) conservan el orden.
sortBy
,
partitionBy
,
join
no conserva el orden.
La razón es que la mayoría de las operaciones RDD funcionan en
Iterator
s dentro de las particiones.
Por lo tanto,
map
o
filter
simplemente no tiene forma de desordenar el orden.
Puedes echar un vistazo al
code
para verlo por ti mismo.
Ahora puede preguntar: ¿Qué pasa si tengo un RDD con un
HashPartitioner
?
¿Qué sucede cuando uso el
map
para cambiar las claves?
Bueno, se mantendrán en su lugar, y ahora el RDD no está particionado por la clave.
Puede usar la
partitionBy
para restaurar la partición con una combinación aleatoria.