Как вы Window.partitionBy над диапазоном или условием? - PullRequest
0 голосов
/ 07 октября 2019

У меня есть некоторые данные, упорядоченные по dateTime, и я хочу сложить значения на основе другого столбца (1 или 0). ОДНАКО, мне нужно сделать это так, чтобы он суммировал значения только через 5 секунд после. Как мне это сделать?

ex Table

|ID  |GPS_TimeStamp         |overG|
---------------------------------
|aa  |2019-08-01 00:18:05.1 |1    |
|aa  |2019-08-01 00:18:06.3 |0    |
|aa  |2019-08-01 00:18:08.4 |1    |
|aa  |2019-08-01 00:18:10.0 |1    |
|aa  |2019-08-01 00:18:11.1 |0    |
|aa  |2019-08-01 00:18:12.2 |0    |
|aa  |2019-08-01 00:18:13.8 |1    |
|aa  |2019-08-01 00:18:16.1 |0    |
---------------------------------

Мой псевдокод, который не работает, выглядит следующим образом

myData = myData.withColumn("overG-sum5Seconds", 
   sum(col("overG")).over(Window.partitionBy(
      "GPS_TimeStamp"
   ).orderBy("GPS_TimeStamp").rangeBetween(0, Window.currentRow+timedelta(seconds=5))
   )

для результата, который выглядит как

|ID  |GPS_TimeStamp         |overG|overG-sum5Seconds|
---------------------------------------------------
|aa  |2019-08-01 00:18:05.1 |1    |3                |
|aa  |2019-08-01 00:18:06.3 |0    |2                |
|aa  |2019-08-01 00:18:08.4 |1    |3                |
|aa  |2019-08-01 00:18:10.0 |1    |2                |
|aa  |2019-08-01 00:18:11.1 |0    |1                |
|aa  |2019-08-01 00:18:12.2 |0    |1                |
|aa  |2019-08-01 00:18:13.8 |1    |1                |
|aa  |2019-08-01 00:18:16.1 |0    |0                |
---------------------------------------------------

Я не могу использовать задержку или опережение, потому что не каждая секунда в списке. Так что это должно быть условие, основанное на GPS_TimeStamp.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Нашел мой ответ после посещения нескольких сайтов.

https://www.linkedin.com/pulse/time-series-moving-average-apache-pyspark-laurent-weichberger

Оказывается, я хотел получить скользящую среднюю / сумму

myData = myData.withColumn("unix", (unix_timestamp("GPS_TimeStamp"))+ expr("substr(GPS_TimeStamp,instr(GPS_TimeStamp, '.'))"))
w = (Window.partitionBy("id").orderBy(col("unix")).rangeBetween(0, 5))
myData = myData.withColumn('rolling_sum', sum("overG").over(w))
0 голосов
/ 07 октября 2019

Оконная рама может решить вашу проблему. Оконные рамы Короче говоря, все, что вам нужно сделать, это условная кумулятивная сумма , вы также можете сослаться на этот ответ, Как получить кумулятивную сумму .

...