取得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中文網其他相關文章!