2016-05-16 31 views
3

我在PySpark上有三列數據框,我試圖在SQL上執行相當於RANK() OVER(PARTITION BY ... ORDER BY ...)的操作。數據幀df樣子:有效的方式來排序()在火花?

col1, col2, score 
A , B , 0.500 
... 

我知道我可以使用窗口功能如下:

from pyspark.sql.window import Window 
from pyspark.sql import functions as F 

windowSpec = Window.partitionBy(df['col1']).orderBy(df['score'].desc()) 
df = df.select('col1', 'col2', 'score', F.rank().over(windowSpec).alias('rnk')) 

對於一個非常大的df,這將需要花費大量的時間跨分區洗牌的數據。有什麼辦法可以讓這個效率更高? (如果沒有必要,我不需要使用數據幀。)

+1

當有partitionBy envolved時,很難避免洗牌。即使使用RDD,也需要'byKey'操作,導致一些洗牌。我不確定是否有更有效的方法來做到這一點。 –

回答

2

添加評論@DanieldePaula;在Spark SQL中,避免洗牌是棘手的(通常不可能)。我已經與Spark Arbrust的牧羊人討論過這個問題 - 理由是如果允許在spark sql中使用相當於preservesPartioning=true(來自許多核心RDD操作)的非專家用戶,可能會得到不正確的結果查詢。

在任何情況下,對於您的查詢,在沒有洗牌的情況下實現結果特別困難 - 因爲您的數據甚至沒有經過適當的預分區。

如果你想獲得更好的性能,你將需要:

  • 滴出火花SQL完全
  • 預分區的數據根據​​所需的窗口
  • 執行你的窗口相當於操作 - 通過核心RDD基元。

現在,這些聲音有點嚴重繁重..所以..你可能只是想和你一起生活從窗口具有的性能。