6
votes

Comment transformer la RDD [(clé, valeur)] en carte [Touche, RDD [valeur]]]

J'ai cherché une solution pendant une longue période mais n'a pas eu d'algorithme correct.

Utiliser Spark RDDs dans Scala, comment puis-je transformer un RDD [(clé, valeur)] une carte [clé, RDD [valeur]]] , sachant que je ne peux pas utiliser de collecte ou d'autres méthodes pouvant charger des données en mémoire?

En fait, mon objectif final est Pour boucler sur mappe [clé, rdd [valeur]]] par clé et appelez SaveAnewapihadoopfile pour chaque RDD [valeur]

Par exemple, si je reçois: xxx

je voudrais: xxx

Je me demande si cela coûterait pas trop pour le faire en utilisant filtre sur chaque touche A, B, C de RDD [(touche, valeur)] , mais je ne sais pas si vous appelez le filtre autant Des temps, différentes clés seraient-elles efficaces? (hors du parcours non, mais peut-être utiliser cache ?)

merci


3 commentaires

"Savoir que je ne peux pas utiliser de collecte ou d'autres méthodes pouvant charger des données en mémoire?". Cela n'a pas de sens. La carte résultante va de toute façon être adaptée à la mémoire.


Juste un coup dur sauvage dans le noir; Ne voudriez pas grouper (...) vous donnerait quelque chose que vous pouvez utiliser? Il devrait vous donner de la RDD [clé, iéres [valeurs]]]]


@THOREDGE Je ne sais pas que un iTAKEAKEF doit correspondre à la mémoire pour une très grande quantité de données, mais en effet, selon mon volume d'entrée, cela pourrait être une solution


3 Réponses :


1
votes

Vous devez utiliser le code comme celui-ci (python):

rdd = sc.parallelize( [("A", 1), ("A", 2), ("A", 3), ("B", 4), ("B", 5), ("C", 6)] ).cache()
keys = rdd.keys().distinct().collect()
for key in keys:
    out = rdd.filter(lambda x: x[0] == key).map(lambda (x,y): y)
    out.saveAsNewAPIHadoopFile (...)


6 commentaires

Je n'étais pas sûr de l'efficacité du filtre, mais je pense que c'est la solution que je vais mettre en œuvre.


Il n'y a pas de transformation prête pour votre logique, j'ai bien peur que si vous voulez quelque chose de plus efficace, vous devez la mettre en œuvre par vous-même.


C'est fondamentalement une solution suboptimale. Vous pouvez satisfaire son objectif final d'écrire à un fichier séparé par clé d'un passage avec un multiletextoutput.


D'accord, vous pouvez avoir une autre solution: Stackoverflow.com/Questtions/23995040/...


Vous devez être conscient tout en exécutant ce code dans la production pendant que vous collectez une action qui fonctionne sur Master. Cela peut conduire à votre maître sortir de la mémoire en un rien de temps.


Vous n'exécutez que pour les clés uniquement et une seule fois. Si vous avez trop de clés, vous aurez également des problèmes HDFS, pas seulement des problèmes de mémoire.



-1
votes

Ceci est mon code de test simple. xxx

Le résultat est inférieur xxx

ou vous pouvez le faire comme ceci xxx p> Le résultat est celui-ci xxx


0 commentaires

0
votes

Cela ressemble à ce que vous voulez vraiment, c'est enregistrer votre KV RDD à un fichier séparé pour chaque touche. Plutôt que de créer une carte [clé, RDD [valeur]]] envisagez d'utiliser un multiplextextoutpopat similaire à l'exemple ici. Le code est à peu près là dans l'exemple.

Le bénéfice de cette approche est que vous êtes garanti de prendre un passage sur la RDD après le shuffle et vous obtenez le même résultat que vous vouliez. Si vous l'avez fait en filtrant et en créant plusieurs identifiants comme suggéré dans l'autre réponse (à moins que vos filtres de poussoir pris en charge de la source), vous finiriez par prendre un passage sur l'ensemble de données pour chaque clé individuelle qui serait bien plus lente.


0 commentaires