2017-02-23 81 views

回答

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) 

有一点需要注意的上面是星火将尝试所有的数据加载到一个分区,以便它可以在大型数据集的速度慢,很遗憾。我希望底层的实现是不同的,但我明白,在任何分布数据的系统上,对有序数据计算滑动窗口是很困难的。

如果你足够幸运,你的移动平均可以对数据的分区中运行,那么你可以改变你的窗口:

ws <- orderBy(windowPartitionBy("my_partition_column"), sdf$orderingColumn)