在组内排序pyspark数据帧

时间:2018-04-10 14:31:19

标签: apache-spark pyspark spark-dataframe pyspark-sql

我想在每个"time"组中对列"id"进行排序。

数据如下:

id  time  name
132  12   Lucy
132  10   John
132  15   Sam
78   11   Kate
78   7    Julia
78   2    Vivien
245  22   Tom

我想得到这个:

id  time  name
132  10   John
132  12   Lucy
132  15   Sam
78   2    Vivien
78   7    Julia
78   11   Kate
245  22   Tom

我试过

df.orderby(['id','time'])

但我不需要对"id"进行排序。

我有两个问题:

  1. 我可以在同一"time"内对"id"进行排序吗?以及如何?
  2. 如果我只是排序"time"而不是使用orderby()对两列进行排序,效率会更高吗?

1 个答案:

答案 0 :(得分:0)

这正是开窗的目的。 您可以创建一个窗口,该窗口由“ id”列划分,并按“ time”列排序。接下来,您可以在该窗口上应用任何功能。

# Create a Window
from pyspark.sql.window import Window
w = Window.partitionBy(df.id).orderBy(df.time)

现在在任何功能上使用此窗口: 例如:假设您要在同一组内的每一行之间创建一列时间变化量

import pyspark.sql.functions as f
df = df.withColumn("timeDelta", df.time - f.lag(df.time,1).over(w))

我希望这能给您一个想法。实际上,您已经使用窗口对数据框进行了排序,现在可以对其应用任何功能。

如果您只想查看结果,则可以找到行号并按其排序。

df.withColumn("order", f.row_number().over(w)).sort("order").show()