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 En fait, mon objectif final est Pour boucler sur Par exemple, si je reçois: p> je voudrais: p> Je me demande si cela coûterait pas trop pour le faire en utilisant merci p> p> P> RDD [(clé, valeur)] code> une carte
[clé, RDD [valeur]]] code>, sachant que je ne peux pas utiliser de collecte ou d'autres méthodes pouvant charger des données en mémoire? p>
mappe [clé, rdd [valeur]]] code> par clé et appelez
SaveAnewapihadoopfile code> pour chaque
RDD [valeur] p> p>
filtre code> sur chaque touche A, B, C de
RDD [(touche, valeur)] code>, 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 code>?) p>
3 Réponses :
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 (...)
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.
Ceci est mon code de test simple. Le résultat est inférieur p> ou vous pouvez le faire comme ceci p>
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 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. P> [clé, RDD [valeur]]] code> envisagez d'utiliser un
multiplextextoutpopat code> similaire à l'exemple ici. Le code est à peu près là dans l'exemple. P>
"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