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"。
我有两个问题:
"time"我可以在相同的范围内排序"id"吗?如何?"time"如果我只是排序会比使用orderby()对两列进行排序更有效吗?这正是窗口化的目的。您可以创建一个按“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)
| 归档时间: |
|
| 查看次数: |
7787 次 |
| 最近记录: |