Question Quelles opérations préservent la commande RDD?


RDD a un significatif (par opposition à un ordre aléatoire imposé par le modèle de stockage) commande si elle a été traitée par sortBy(), comme expliqué dans cette répondre.

Maintenant, quelles opérations préserver cet ordre?

Par exemple, est-ce garanti que (après a.sortBy())

a.map(f).zip(a) === 
a.map(x => (f(x),x))

Que diriez-vous

a.filter(f).map(g) === 
a.map(x => (x,g(x))).filter(f(_._1)).map(_._2)

qu'en est-il de

a.filter(f).flatMap(g) === 
a.flatMap(x => g(x).map((x,_))).filter(f(_._1)).map(_._2)

Ici "égalité" === On entend par "équivalence fonctionnelle", c’est-à-dire qu’il n’existe aucun moyen de distinguer le résultat en utilisant des opérations au niveau de l’utilisateur (c’est-à-dire sans lire les journaux & c).


42
2018-03-26 16:39


origine


Réponses:


Toutes les opérations conservent l'ordre, sauf celles qui ne le font pas explicitement. La commande est toujours "significative", pas seulement après un sortBy. Par exemple, si vous lisez un fichier (sc.textFile) les lignes du RDD seront dans l’ordre où elles se trouvaient dans le fichier.

Sans essayer de donner une liste complète, map, filter, flatMap, et coalesce (avec shuffle=false) conserve l'ordre. sortBy, partitionBy, join ne conservez pas la commande.

La raison en est que la plupart des opérations RDD fonctionnent sur Iterators à l'intérieur des partitions. Alors map ou filter n'a aucun moyen de gâcher la commande. Vous pouvez jeter un oeil à la code à voir par vous-même

Vous pouvez maintenant demander: Et si j'ai un RDD avec un HashPartitioner. Que se passe-t-il quand j'utilise map changer les clés? Eh bien, ils resteront en place, et maintenant le RDD n'est pas partitionné par la clé. Vous pouvez utiliser partitionBy restaurer le partitionnement avec un shuffle.


43
2018-03-27 12:57