获取 Spark RDD 的等效 SQL Row_Number
在 SQL 中,row_number() 函数允许生成唯一的行号对于分区有序表中的每一行。可以使用 RDD 在 Spark 中复制此功能,本文概述了如何实现此功能。
考虑具有模式 (K, V) 的 RDD,其中 V 表示元组 (col1, col2, col3)。目标是获得一个新的 RDD,其中附加一列表示每个元组的行号,由键 K 上的分区组织。
第一次尝试
一个常见的方法是收集 RDD 并使用 sortBy()、sortWith() 或 sortByKey() 等函数对其进行排序。但是,此方法不维护 row_number() 函数的分区方面。
分区感知排序
要实现分区行号,您可以利用窗口函数在斯帕克.然而,窗口函数主要设计用于 DataFrame,而不是 RDD。
使用 DataFrame
幸运的是,在 Spark 1.4 中,row_number() 功能可用于 DataFrame 。按照此示例:
# 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() )
这将生成一个带有分区行号的 DataFrame。
以上是如何使用 RDD 在 Spark 中复制 SQL 的 row_number() 函数?的详细内容。更多信息请关注PHP中文网其他相关文章!