Maison >base de données >tutoriel mysql >Comment répliquer la fonction row_number() de SQL dans Spark à l'aide de RDD ?

Comment répliquer la fonction row_number() de SQL dans Spark à l'aide de RDD ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-24 01:18:19537parcourir

How to Replicate SQL's row_number() Function in Spark Using RDDs?

Obtention d'un équivalent SQL Row_Number pour un RDD Spark

En SQL, la fonction row_number() permet de générer un numéro de ligne unique pour chaque ligne d'une table partitionnée et ordonnée. Cette fonctionnalité peut être répliquée dans Spark à l'aide de RDD, et cet article explique comment y parvenir.

Considérez un RDD avec le schéma (K, V), où V représente un tuple (col1, col2, col3). Le but est d'obtenir un nouveau RDD avec une colonne supplémentaire représentant le numéro de ligne de chaque tuple, organisé par une partition sur la clé K.

Première tentative

Une commune L'approche consiste à collecter le RDD et à le trier à l'aide de fonctions telles que sortBy(), sortWith() ou sortByKey(). Cependant, cette méthode ne conserve pas l'aspect de partitionnement de la fonction row_number().

Ordre tenant compte de la partition

Pour obtenir des numéros de lignes partitionnés, vous pouvez exploiter les fonctions de Windows. dans Spark. Cependant, les fonctions Window sont principalement conçues pour être utilisées avec des DataFrames, et non avec des RDD.

Utilisation de DataFrames

Heureusement, à partir de Spark 1.4, la fonctionnalité row_number() est disponible pour les DataFrames. . En suivant cet exemple :

# Create a test DataFrame
testDF = sc.parallelize(
    (Row(k="key1", v=(1,2,3)),
     Row(k="key1", v=(1,4,7)),
     Row(k="key1", v=(2,2,3)),
     Row(k="key2", v=(5,5,5)),
     Row(k="key2", v=(5,5,9)),
     Row(k="key2", v=(7,5,5))
    )
).toDF()

# Add the partitioned row number
(testDF
 .select("k", "v",
         F.rowNumber()
         .over(Window
               .partitionBy("k")
               .orderBy("k")
              )
         .alias("rowNum")
        )
 .show()
)

Cela générera un DataFrame avec les numéros de lignes partitionnés.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn