在之前的 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
确实在所有的id
s 上运行——但我需要输出!
任何输入将不胜感激。