【问题标题】: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 中的连续行
- 然后按
user、loc 和group 列对数据框进行分组,并使用min 和max 聚合列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|
+----+---+----------+----------+