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!