在之前的 RDD 范式下,我可以指定一个键,然后将一个操作映射到每个键对应的 RDD 元素。从 1.5.1 开始,我看不到使用 SparkR 中的 DataFrame 执行此操作的明确方法。我想做的是类似dplyr操作:
new.df <- old.df %>%
group_by("column1") %>%
do(myfunc(.))
我目前有一个大型 SparkR DataFrame 的形式:
timestamp value id
2015-09-01 05:00:00.0 1.132 24
2015-09-01 05:10:00.0 null 24
2015-09-01 05:20:00.0 1.129 24
2015-09-01 05:00:00.0 1.131 47
2015-09-01 05:10:00.0 1.132 47
2015-09-01 05:10:00.0 null 47
我按id和排序timestamp。
我想分组id,但我不想聚合。相反,我想对每个组进行一组转换和计算——例如,插值以填充 NA(当我collect使用 DataFrame 然后转换value为数字时生成)。我已经使用 进行了测试agg,但是虽然我的计算确实可以运行,但没有返回结果,因为我没有在 中返回单个值myfunc:
library(zoo)
myfunc <- function(df) {
df.loc <- collect(df)
df.loc$value <- as.numeric(df.loc$value)
df.loc$newparam <- na.approx(df.loc$value, na.rm = FALSE)
return(df.loc)
# I also tested return(createDataFrame(sqlContext, df.loc)) here
}
df <- read.df( # some stuff )
grp <- group_by(df, "id")
test <- agg(grp, "myfunc")
15/11/11 18:45:33 INFO scheduler.DAGScheduler: Job 2 finished: dfToCols at NativeMethodAccessorImpl.java:-2, took 0.463131 s
id
1 24
2 47
请注意,myfunc当我filter将 DataFrame 缩减为单个id并运行它时,所有操作都可以正常工作。根据运行所需的时间(每个任务大约 50 秒)和没有抛出异常的事实,我相信myfunc确实在所有的ids 上运行——但我需要输出!
任何输入将不胜感激。