Можно ли применить агрегатные функции к нескольким столбцам в окне информационного блока в pyspark?
Например, я знаю, что могу сделать что-то вроде этого:
from pyspark.sql.window import Window
import pyspark.sql.functions as f
columns = ["id", "x","y", "timestamp"]
values = [
(1, 1, "test","2018-12-31"),
(1, 3, "test","2018-11-30"),
(1, 5, "test1","2018-09-30"),
(1, 2, "test1","2018-08-31")]
df = spark.createDataFrame(values, columns)
df = df.withColumn("date", f.to_date("timestamp", "yyyy-MM-dd"))
w = Window.partitionBy("x").orderBy("date").rowsBetween(-(3 - 1), 0)
Сейчасесли я хочу применить агрегирование ко всем столбцам:
agg_list = [f.avg, f.sum, f.max, f.min]
for c in df.columns[1:3]:
for af in agg_list:
df = df.withColumn(str(c) + '_'+ af.__name__, af(c).over(w))
Это работает нормально, но я хотел бы знать, есть ли лучший способ сделать это?Я знаю, что в groupBy я могу применить эти агрегаты в одном выражении ко всем столбцам, не записывая все для циклов, существует ли аналогичный подход, но для Windows?
Особенно для больших наборов данных и нескольких временных окон, это, кажется, занимает много времени.
Спасибо!