我需要使用R on Spark在大型时间序列数据集上进行移动平均。
我看到Scala和Java中有这个实现: Moving Average in Spark Java, Apache Spark Moving Average 但 R 中没有任何内容。
答案 0 :(得分:0)
我设法使用SparkR窗口函数解决了这个问题。我使用Spark 2.0 btw。
set.seed(123)
#generate poisson distribution for easy checking, with lambda = 15
n <- 1000
orderingColumn = seq(1,n)
data = rpois(n, 15)
df <- data.frame(orderingColumn, data)
#Create sparkdf
sdf <- as.DataFrame(df);
#Moving average
ws <- windowOrderBy(sdf$orderingColumn)
frame <- rowsBetween(ws, -100, 0) #100 observations back included in average
sdfWithMa <- withColumn(sdf, "moving_average", over(avg(sdf$data), frame))
head(sdfWithMa, 100)
上面要注意的一点是,Spark会尝试将所有数据加载到单个分区中,因此不幸的是,它可能比大型数据集慢。我希望底层实现是不同的,但我知道在任何分发数据的系统上计算有序数据上的滑动窗口是很困难的。
如果您足够幸运,您的移动平均线可以在数据分区上运行,那么您可以更改窗口:
ws <- orderBy(windowPartitionBy("my_partition_column"), sdf$orderingColumn)