我在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
,这需要花费大量时间在分区之间移动数据。有没有办法让这个更有效率? (如果没有必要,我不需要使用数据框。)
答案 0 :(得分:2)
添加@DanieldePaula的评论;在Spark SQL中,避免混乱是很棘手的(通常是不可能的)。我与spark sql Michael Armbrust的牧羊人就此进行过讨论 - 理由是非专家用户如果允许使用等效的let args = [image, targetCoord, targetColor]
let final = kernel?.applyWithExtent(image.extent, arguments: args)
(来自许多核心{{}},可能会得到错误的结果。火花sql查询中的1}}操作。
在你的查询的任何情况下,如果没有随机播放就很难实现结果 - 因为你的数据甚至还没有正确预分区。
如果您希望获得更好的性能,则需要:
preservesPartioning=true
原语手动执行窗口化操作的等效操作。现在那些声音严重繁重......所以......你可能只想忍受你从窗口中获得的表现。