【问题标题】:pyspark window min(date) and max(date) of group组的 pyspark 窗口 min(date) 和 max(date)
【发布时间】:2023-03-12 14:53:01
【问题描述】:

我有数据集

user date loc
a 2021-01-01 1
a 2021-01-02 1
a 2021-01-03 2
a 2021-01-04 2
a 2021-01-05 1
a 2021-01-06 1

我正在尝试结束

user startdate enddate loc
a 2021-01-01 2021-01-02 1
a 2021-01-03 2021-01-04 2
a 2021-01-05 2021-01-06 1

我已经尝试过 [user,loc].order by date 的窗口分区 行号 我尝试了延迟检查是否 prevrow loc = current loc 然后增加值 但我被困住了。 有没有人有这个分组问题的解决方案。不知道为什么我很难弄清楚

感谢您的帮助

【问题讨论】:

  • 感谢您修复格式

标签: pyspark group-by window partition


【解决方案1】:

这是解决问题的一种方法

  • 根据user 创建一个帮助器group 列来区分loc 中的连续行
  • 然后按userlocgroup 列对数据框进行分组,并使用minmax 聚合列date
  • 删除group 列并按startdate 对数据框进行排序
w = Window.partitionBy('user').orderBy('date')
b = F.lag('loc').over(w) != F.col('loc')

(
    df.withColumn('group', b.cast('int'))
      .fillna(0, 'group')
      .withColumn('group', F.sum('group').over(w))
      .groupBy('user', 'loc', 'group')
      .agg(F.min('date').alias('startdate'), 
           F.max('date').alias('enddate'))
      .drop('group')
      .orderBy('startdate')
)

+----+---+----------+----------+
|user|loc| startdate|   enddate|
+----+---+----------+----------+
|   a|  1|2021-01-01|2021-01-02|
|   a|  2|2021-01-03|2021-01-04|
|   a|  1|2021-01-05|2021-01-06|
+----+---+----------+----------+

【讨论】:

  • 效果很好,感谢您抽出宝贵时间提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 2020-11-01
  • 1970-01-01
  • 2022-07-16
  • 1970-01-01
  • 2020-06-18
相关资源
最近更新 更多