¿Qué operaciones conservan el orden RDD?
RDD tiene un significativo (a diferencia de algún orden aleatorio impuesto por el modelo de almacenamiento) si fue procesado por sortBy()
, como se explica en esta respuesta.
Ahora, ¿qué operaciones mantienen ese orden?
Por ejemplo, ¿es garantizado que (después de a.sortBy()
)
a.map(f).zip(a) ===
a.map(x => (f(x),x))
¿Qué tal
a.filter(f).map(g) ===
a.map(x => (x,g(x))).filter(f(_._1)).map(_._2)
¿Qué pasa con
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 manera para distinguir el resultado utilizando operaciones a nivel de usuario (es decir, sin leer registros y c).
1 answers
Todas las operaciones conservan el orden, excepto aquellas que explícitamente no lo hacen. El orden es siempre "significativo", no solo después de un sortBy
. Por ejemplo, si lee un fichero (sc.textFile
) las líneas del RDD estarán en el orden en que estaban en el fichero.
, Sin tratar de dar una lista completa, map
, filter
, flatMap
, y coalesce
(con shuffle=false
) no conservar el orden. sortBy
, partitionBy
, join
no conserve el orden.
La razón es que la mayoría de las operaciones RDD funcionan en Iterator
s dentro de la partición. Así que map
o filter
simplemente no tiene forma de estropear el orden. Usted puede echar un vistazo a la código para verlo por ti mismo.
Ahora puedes preguntar: ¿Qué pasa si tengo un RDD con un HashPartitioner
. ¿Qué sucede cuando uso map
para cambiar las claves? Bueno, se quedarán en su lugar, y ahora el RDD no está dividido por la clave. Puede usar partitionBy
para restaurar la partición con un barajado.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-29 20:56:09