#pyspark #group-by #window #partition
Вопрос:
у меня есть набор данных
пользователь | Дата | лок |
---|---|---|
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 |
я пытаюсь закончить с
пользователь | дата начала | дата окончания | лок |
---|---|---|---|
a | 2021-01-01 | 2021-01-02 | 1 |
a | 2021-01-03 | 2021-01-04 | 2 |
a | 2021-01-05 | 2021-01-06 | 1 |
Я попытался разбить окно на[пользователь,loc].упорядочить по номеру строки даты, и я попытался проверить, соответствует ли preprow loc = текущему loc, а затем увеличить значение, но я застрял. у кого-нибудь есть решение этой проблемы с группировкой. Не уверен, почему мне так трудно понять
спасибо за любую помощь
Комментарии:
1. спасибо за исправление формирования
Ответ №1:
Вот один из способов подойти к проблеме
- Создайте вспомогательный
group
столбец, чтобы различать последовательные строки вloc
каждомuser
- Затем сгруппируйте фрейм данных по столбцам
user
loc
group
и агрегируйте столбецdate
с помощьюmin
иmax
- Удалите
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|
---- --- ---------- ----------
Комментарии:
1. Это сработало фантастически, спасибо, что нашли время помочь.