У меня есть данные с сгруппированными столбцами по названию и дате продукта.Теперь я хочу ранжировать столбец product_purchased с указанием даты и времени.А затем вычтите между последующими рангами, чтобы получить разницу дат и агрегировать в столбце вычитаемых значений.
Prod Name Hour
A 20
B 13
C 17
A 20
B 12
После группировки по df будет выглядеть как
Prod Name Hour Count
A 20 2
B 13 1
C 17 1
B 12 1
aggs_date = load.groupBy ("product_name", "hour"). agg ((count ("*"). alias ("cnt")), (F.rank ('date_logged'). alias ('rank'))
load.select('date_logged').show(20,False)
+---------------------------+
|date_logged |
+---------------------------+
|2018-06-12 05:38:00.0000000|
|2018-08-20 17:15:00.0000000|
|2018-08-20 20:40:00.0000000|
|2018-08-14 06:39:00.0000000|
|2018-06-23 06:32:00.0000000|
|2018-05-22 09:33:00.0000000|
Я хочу, чтобы группы имели ранг, а затем столбец product_purchased должен быть вычтен с предыдущим рангом (ранг 1 - ранг 2) и дать разницу в днях. И дальнейшие агрегации в столбце различий.
Какой подход для решения этой проблемы?
ranked = load.withColumn("rank", dense_rank().over(Window.partitionBy("product_name").orderBy(desc("product_purchased"))))
grouped = ranked.groupBy("hour", "product_name").agg(F.collect_list(F.struct("rank")).alias("tmp"))
Это выглядит так:
grouped.show()
+----+------------------------+--------------------+
|hour|primary_application_name| tmp|
+----+------------------------+--------------------+
| 0| E-RE |[[10], [238], [23...|
| 0| ACQU... |[[55], [71], [72]...|
| 0| MOBILE MESSA... | [[2]]|
| 0| JADE|[[21], [75], [134...|
| 0| p2 | [[114], [174]]|
| 1| ACQU... |[[18], [19], [54]...|
| 1| MOBILE MESSA... | [[3]]|
| 1| JADE|[[19], [20], [74]...|
| 2| E-RE |[[6], [236], [236...|
| 2| DATA ACQU... |[[265], [305], [7...|
| 2| JADE|[[42], [66], [73]...|
| 2| LM RAT... | [[3]]|
| 3| VULNERAB... |[[42], [52], [65]...|
| 3| WE... | [[3]]|
Я хочу найти разницу в датах между рангами (238-10),(239-238) .. и т. Д.