2017-04-26 93 views
0

我在PySpark做到了這一點:使用Spark的RDD.combineByKey()是否保留先前排序的DataFrame的順序?

  1. 創建一個DataFrame一個SELECT聲明獲得通過資產的序列號,然後按時間排序的資產數據。
  2. 使用DataFrame.map()DataFrame轉換爲RDD
  3. 使用RDD.combineByKey()來整理每個資產的所有數據,使用該資產的序列號作爲關鍵字。

問:我可以肯定的是每項資產的數據仍然會在RDD從最後一步產生的時間順序進行排序?

時間順序對我至關重要(我需要計算每個資產的數據移動時間窗口的統計數據)。當RDD.combineByKey()將來自Spark羣集中不同節點的數據組合爲給定密鑰時,是否保留該密鑰數據中的任何順序?或者,對於給定的密鑰,來自不同節點的數據是否以特定順序組合?

回答

0

我可以確定每個資產的數據仍然會按照最後一步所產生的RDD中的時間順序排序嗎?

你不行。當您在多個維度上應用排序(數據按資產序號排序,然後時間)時,單個asset的記錄可以分佈在多個分區中。 combineByKey將需要洗牌,並且不保證這些部件組合的順序。

可以與repartitionsortWithinPartitions(或its equivalent on RDDs)嘗試:

df.repartition("asset").sortWithinPartitions("time") 

​​

或窗函數與幀定義如下:

w = Window.partitionBy("asset").orderBy("time") 

在火花> = 2.0窗口函數可以與一起使用所以如果你在Scala中編寫自己的SQL擴展可以完全跳過到RDD的轉換。

相關問題