Comment obtenir la nième ligne de Spark RDD?
Supposons que j'ai un CA d'objets arbitraires. Je souhaite obtenir le 10ème (disons) de la ligne de la RDD. Comment dois-je procéder?
Une façon est d'utiliser des rdd.prendre(n), puis l'accès au n-ième élément est l'objet, mais cette approche est lente lorsque n est grand.
Je crois que les réponses à question sont également applicables ici.
OriginalL'auteur user1742188 | 2015-01-07
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas combien il est efficace, car elle repose sur l'actuel et le futur des optimisations dans l'Étincelle du moteur, mais vous pouvez essayer de faire ce qui suit:
La première fonction transforme la RDD dans une paire (valeur, idx) avec idx allant de 0 à partir. La seconde fonction prend l'élément avec idx==9 (10e). La troisième fonction prend la valeur d'origine. Ensuite, le résultat est retourné.
La première fonction pourrait être tiré vers le haut par le moteur d'exécution et d'influencer le comportement de l'ensemble du traitement. Lui donner un essai.
En tout cas, si n est très grande, cette méthode est efficace en ce qu'elle ne nécessite pas de recueillir un tableau de la première n éléments dans le pilote nœud.
zipWithIndex
nécessite un passage complet sur les données pour calculer l'indice de décalage de chaque partition. C'est probablement votre meilleur pari si.Je l'ai essayé et il est lent. Ok pour peut-être obtenir une ligne, mais l'obtention de plusieurs lignes, un à la fois est très lent
Pourquoi est-ce si absurde dur?
.first
est toute sa prend pour la première ligne... question Sérieuse.OriginalL'auteur Nicola Ferraro
Je n'ai pas vérifié cette immense quantité de données. Mais il fonctionne très bien pour moi.
n
valeurs qu'elle aura pour résultat l'obtention de la premièren
éléments (qui est affectée par le partitionnement...) pour le code de pilote lui-même... donc il peut être lent ou même impossible à faire...D'accord. Est-il un moyen efficace de le faire?
Autant que je sache: Nicolas Ferraro la réponse ci-dessus contient la meilleure approche que nous avons actuellement. stackoverflow.com/a/27826498/2846609
OriginalL'auteur Jack Daniel
RDD.collect()
etRDD.take(x)
à la fois renvoyer une liste, qui prend en charge l'indexation. Donc, chaque fois que nous avons besoin d'un élément à la position N. Nous pouvons effectuer l'une des deux codes suivants:RDD.collect()[N-1]
ou
RDD.take(N)[N-1]
fonctionne correctement quand nous voulons élément à la position N.
OriginalL'auteur Neeraj Mehta