En SQL, la fonction row_number() attribue un numéro de ligne unique à chaque enregistrement d'une table, partitionné par un ensemble donné de colonnes et ordonné par un autre ensemble. La réplication de cette fonctionnalité pour un Spark RDD peut être effectuée en suivant les étapes suivantes :
1. Créez un PairRDD de paires clé-valeur
Convertissez le RDD des tuples (K, V) en un PairRDD de (K, (V, 1)) paires. Cela permettra d'appliquer le tri en fonction à la fois de la clé K et de la valeur d'espace réservé 1.
2. Triez le RDD
Utilisez sortByKey() pour trier le PairRDD en fonction de la clé K. Cela regroupera tous les enregistrements avec la même clé.
3. Zip With Index
Appelez zipWithIndex() sur le RDD trié pour ajouter une colonne supplémentaire représentant le numéro de ligne dans chaque partition de clé.
4. Combinez la clé, les valeurs et les numéros de ligne
Extrayez la clé, les valeurs et les numéros de ligne du PairRDD à l'aide d'une fonction de mappage et combinez-les dans un nouveau tuple (K, V, rowNum).
Ce processus vous permet d'attribuer des numéros de ligne à chaque enregistrement du RDD, reproduisant ainsi efficacement la fonctionnalité de la fonction row_number() de SQL avec partitionnement.
Exemple :
val temp1 = sc.parallelize(Seq(((3,4),5,5,5),((3,4),5,5,9),((3,4),7,5,5),((1,2),1,2,3),((1,2),1,4,7),((1,2),2,2,3))) val temp2 = temp1 .map(x => (x, 1)) .sortByKey() .zipWithIndex() .map(a => (a._1._1, a._1._2._1, a._1._2._2, a._1._2._3, a._2 + 1)) temp2.collect().foreach(println)
Sortie :
((1,2),1,2,3,2) ((1,2),1,4,7,1) ((1,2),2,2,3,3) ((3,4),5,5,5,4) ((3,4),5,5,9,5) ((3,4),7,5,5,6)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!