对组内的 pyspark 数据帧进行排序

MLa*_*Lam 8 apache-spark apache-spark-sql pyspark

我想对"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
Run Code Online (Sandbox Code Playgroud)

我想得到这个:

id  time  name
132  10   John
132  12   Lucy
132  15   Sam
78   2    Vivien
78   7    Julia
78   11   Kate
245  22   Tom
Run Code Online (Sandbox Code Playgroud)

我试过

df.orderby(['id','time'])
Run Code Online (Sandbox Code Playgroud)

但我不需要排序"id"

我有两个问题:

  1. "time"我可以在相同的范围内排序"id"吗?如何?
  2. "time"如果我只是排序会比使用orderby()对两列进行排序更有效吗?

pen*_*uin 8

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

# Create a Window
from pyspark.sql.window import Window
w = Window.partitionBy(df.id).orderBy(df.time)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

df.withColumn("order", f.row_number().over(w)).sort("order").show()
Run Code Online (Sandbox Code Playgroud)