PySpark: сделать простое скользящее окно для n элементов и агрегировать с помощью функции

Я знаю, что эта тема уже опубликована, но я до сих пор не понимаю функцию Windows в pyspark. Я просто хочу сделать это на кадре данных pyspsark: data.rolling(5).agg('sum') -> это в Pandas.

Я хочу это в pyspark. Не нужно группировать или упорядочивать, просто сдвиньте окно по столбцу и вычислите сумму (или мою собственную функцию).

Пример :

df = pd.DataFrame({'A': [1,1,2,2,1,2],
                    'B': [2,2,3,4,2,1]})

print(df)
   A  B
0  1  2
1  1  2
2  2  3
3  2  4
4  1  2
5  2  1

Результат :

print(df.rolling(3).agg('sum'))
     A    B
0  NaN  NaN
1  NaN  NaN
2  4.0  7.0
3  5.0  9.0
4  5.0  9.0
5  5.0  7.0

Спасибо


person Emerois    schedule 24.06.2020    source источник


Ответы (1)


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

from pyspark.sql import Window
from pyspark.sql.functions import *


df1.show()
+---+---+
| v1| v2|
+---+---+
|  1|  2|
|  1|  4|
|  2|  2|
|  2|  4|
|  2|  4|
|  2|  4|
|  2|  4|
|  2|  4|
+---+---+


w = Window().partitionBy(lit(1)).rowsBetween(-2,0)
df1.select(sum('v1').over(w).alias('v1'),sum('v2').over(w).alias('v2')).show()

+---+---+
| v1| v2|
+---+---+
|  1|  2|
|  2|  6|
|  4|  8|
|  5| 10|
|  6| 10|
|  6| 12|
|  6| 12|
|  6| 12|
+---+---+

Вы можете явно установить первые две строки нулевыми, если хотите

person Shubham Jain    schedule 24.06.2020
comment
Спасибо за ответ, но я не понимаю одного. Я хочу заменить функцию суммы своей собственной функцией. Но когда я это делаю: df1.select(my_func('v1').over(w) Моя функция не получает данные из столбца, а просто строку с именем моего столбца. Почему? - person Emerois; 24.06.2020
comment
Потому что в spark вам нужно создать UDF для преобразования значения столбца, но я не пробовал udf с оконной функцией. - person Shubham Jain; 24.06.2020