【问题标题】:sort pyspark dataframe within groups对组内的 pyspark 数据帧进行排序
【发布时间】:2019-02-10 10:00:59
【问题描述】:

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

数据如下:

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. 我可以在同一个"id" 中对"time" 进行排序吗?以及如何?
  2. 如果我只对"time" 进行排序会比使用orderby() 对两列进行排序更有效吗?

【问题讨论】:

  • 您不能在id 内对time 进行排序并直接维护行顺序。这样做的唯一方法是添加一个指定组排序的列,并在排序时使用它。

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


【解决方案1】:

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

# 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-30
    • 2015-09-16
    • 2020-05-15
    • 2020-07-10
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    相关资源
    最近更新 更多