我想在每个"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"
进行排序。
我有两个问题:
"time"
内对"id"
进行排序吗?以及如何?"time"
而不是使用orderby()
对两列进行排序,效率会更高吗?答案 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()