Ранжируйте столбец дата-время сгруппированных данных и найдите разницу между последующими рангами - PullRequest
0 голосов
/ 12 октября 2018

У меня есть данные с сгруппированными столбцами по названию и дате продукта.Теперь я хочу ранжировать столбец 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) .. и т. Д.

...