Comment obtenir de l'élément à l'Index dans l'Étincelle RDD (Java)
Je sais que la méthode de rdd.(première) qui me donne le premier élément dans un EDR.
Il y a aussi la méthode de rdd.prendre(num) Qui me donne le premier "num" éléments.
Mais n'est-il pas une possibilité pour obtenir un élément à l'index?
Grâce.
Vous devez vous connecter pour publier un commentaire.
Cela devrait être possible, par la première indexation de la RDD. La transformation
zipWithIndex
fournit une stabilité de l'indexation, la numérotation de chaque élément dans l'ordre original.Donné:
rdd = (a,b,c)
À la recherche d'un élément à l'index, ce formulaire n'est pas utile. Nous avons d'abord besoin d'utiliser l'index de clé:
Maintenant, il est possible d'utiliser le
lookup
action dans PairRDD de trouver un élément clé:Si vous vous attendez à utiliser
lookup
souvent sur le même CA, je vous recommande pour mettre en cache lesindexKey
RDD pour améliorer les performances.Comment faire cela en utilisant la API Java est un exercice laissé au lecteur.
map(_.swap)
pour passer des clés et des valeurs.zipWithIndex
etlookup
sont les mêmes en Java, de sorte que seules lesmap
fonction nécessite un petit effort pour permuter les valeurs de la (clé, valeur) dans (valeur, clé) ce n'est pas de base pour cette question.indexKey
être partitionné.J'ai essayé cette classe pour aller chercher un élément par son indice. Tout d'abord, lorsque vous construisez
new IndexedFetcher(rdd, itemClass)
, il compte le nombre d'éléments dans chaque partition de la RDD. Ensuite, lorsque vous appelezindexedFetcher.get(n)
, il exécute un travail uniquement sur la partition qui contient l'indice.Remarque que j'avais besoin de le compiler à l'aide de Java 1.7 au lieu de 1.8; comme d'Étincelle 1.1.0, le logiciel org.objectweb.asm dans com.esotericsoftware.reflectasm ne peut pas lire Java 1.8 classes encore (throws exception IllegalStateException lorsque vous essayez de runJob Java 1.8 fonction).
Je suis coincé sur ce pendant un certain temps, donc de s'étendre sur les Maasg réponse mais répondant à regarder pour une plage de valeurs de l'indice pour Java (vous aurez besoin de définir les 4 variables en haut):
Rappelez-vous que lorsque vous exécutez ce code de votre cluster de Java 8 (comme une expression lambda est en cours d'utilisation).
Aussi, zipWithIndex est probablement cher!
code
rdd.filtre(la nouvelle Fonction<Tuple2<Ligne, Longue>, Boolean>(){ public Boolean appel(Tuple2<Ligne, Longue> v1){ return v1._2 >= start && v1._2 < end; });code