Esprit soufflé: RDD.méthode zip ()
Je viens de découvert le RDD.zip()
méthode et je ne peux pas imaginer ce que son contrat pourrait éventuellement être.
Je comprends ce qu'il fait , bien sûr. Cependant, il a toujours été ma compréhension que
- l'ordre des éléments dans un RDD est un concept sans signification
- le nombre de partitions et leur taille est un détail d'implémentation disponible uniquement pour les performances de l'utilisateur réglage
En d'autres termes, un RDD est un (multi)l'ensemble, pas séquence (et, bien sûr, dans, par exemple, Python, on obtient AttributeError: 'set' object has no attribute 'zip'
)
Quel est le problème avec ma compréhension ci-dessus?
Quelle était la raison d'être de cette méthode?
Est-ce légal en dehors du contexte trivial comme a.map(f).zip(a)
?
Modifier 1:
- une Autre méthode est fou
zipWithIndex()
, ainsi que les différentszipPartitions()
les variantes. - notez que
first()
ettake()
sont pas fou car ils sont un peu (non aléatoire) des échantillons de la RDD. -
collect()
est aussi bon qu'il convertit unset
pour unsequence
, ce qui est parfaitement légitime.
Lorsque vous calculez un RDD à partir d'un autre, l'ordre des éléments dans le nouveau RDD peut ne pas correspondre à celui de l'ancien.
Cela semble impliquer que même le trivial a.map(f).zip(a)
est pas garanti pour être équivalent à a.map(x => (f(x),x))
. Quelle est la situation lorsque zip()
les résultats sont reproductibles ?
2 réponses
Il n'est pas vrai que les RDDs sont toujours non ordonnés. Un RDD a un ordre garanti s'il est le résultat d'une opération sortBy
, par exemple. Un RDD n'est pas un ensemble; il peut contenir des doublons. Le partitionnement n'est pas opaque pour l'appelant et peut être contrôlé et interrogé. De nombreuses opérations préservent à la fois le partitionnement et l'ordre, comme map
. Cela dit, je trouve un peu facile de violer accidentellement les hypothèses dont zip
dépend, car elles sont un peu subtiles, mais elles ont certainement un but.
Le modèle mental que j'utilise (et recommande) est que les éléments D'un RDD sont ordonnés, mais lorsque vous calculez un RDD à partir d'un autre, l'ordre des éléments dans le nouveau RDD peut ne pas correspondre à celui de l'ancien.
Pour ceux qui veulent être au courant des partitions, je dirais que:
- Les partitions D'un RDD ont un ordre.
- les éléments d'une partition ont un ordre.
- Si vous pensez à "concaténer" les partitions (disons les poser " fin à fin " dans l'ordre) en utilisant l'ordre des éléments en leur sein, l'ordre global avec lequel vous vous retrouvez correspond à l'ordre des éléments si vous ignorez les partitions.
Mais encore une fois, si vous calculez un RDD à partir d'un autre, tous les paris sur les relations d'ordre des deux RDD sont désactivés.
Plusieurs membres de la classe RDD (je fais référence à L'API Scala) suggèrent fortement un concept d'ordre (tout comme leur documentation):
collect()
first()
partitions
take()
zipWithIndex()
Comme Partition.index
ainsi que SparkContext.parallelize()
et SparkContext.makeRDD()
(qui prennent tous deux un Seq[T]
).
D'après mon expérience, ces façons d '"observer" l'ordre donnent des résultats cohérents les uns avec les autres, et celles qui se traduisent entre les RDDS et les collections Scala ordonnées se comportent comme vous pouvez vous y attendre-elles préservent l'ordre global des éléments. C'est pourquoi je dis que, dans la pratique, les RDDs ont un concept d'ordre significatif.
En outre, bien qu'il existe évidemment de nombreuses situations où le calcul D'un RDD à partir d'un autre doit modifier l'ordre, dans mon expérience, l'ordre tend à être préservé où il est possible/raisonnable de le faire. Les opérations qui ne re-partitionnent pas et ne changent pas fondamentalement l'ensemble des éléments ont surtout tendance à préserver l'ordre.
Mais cela m'amène à votre question sur le "contrat", et en effet la documentation a un problème à cet égard. Je n'ai pas vu un seul endroit où l'effet d'une opération sur l'ordre des éléments est clairement indiqué. (La classe OrderedRDDFunctions
ne compte pas, car il fait référence à un ordre basé sur les données, qui peut différer de l'ordre brut des éléments dans le RDD. De même la classe RangePartitioner
.) Je peux voir comment cela pourrait vous amener à conclure qu'il n'y a Pas de concept d'ordre des éléments, mais les exemples que j'ai donnés ci-dessus rendent ce modèle insatisfaisant pour moi.