在Spark上排名()的有效方法?

时间:2016-05-16 16:56:43

标签: hadoop apache-spark pyspark

我在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 个答案:

答案 0 :(得分:2)

添加@DanieldePaula的评论;在Spark SQL中,避免混乱是很棘手的(通常是不可能的)。我与spark sql Michael Armbrust的牧羊人就此进行过讨论 - 理由是非专家用户如果允许使用等效的let args = [image, targetCoord, targetColor] let final = kernel?.applyWithExtent(image.extent, arguments: args) (来自许多核心{{}},可能会得到错误的结果。火花sql查询中的1}}操作。

你的查询的任何情况下,如果没有随机播放就很难实现结果 - 因为你的数据甚至还没有正确预分区。

如果您希望获得更好的性能,则需要:

  • 完全退出spark sql
  • 根据所需的窗口预分区数据
  • 通过核心preservesPartioning=true原语手动执行窗口化操作的等效操作。

现在那些声音严重繁重......所以......你可能只想忍受你从窗口中获得的表现。