окно pyspark минимальное(дата) и максимальное(дата) количество групп

#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. Это сработало фантастически, спасибо, что нашли время помочь.