假设我想执行如下内容:
library(SparkR)
...
df = spark.read.parquet(<some_address>)
df.gapply(
df,
df$column1,
function(key, x) {
return(data.frame(x, newcol1=f1(x), newcol2=f2(x))
}
)其中函数的返回有多个行。要明确的是,文档中的示例(很遗憾地重复了星火文档中的许多示例非常简单)并不能帮助我识别是否会像我预期的那样处理。
对于在DataFrame中创建的具有每个组的n_k输出行的k个组,我期望这样的结果是,gapply()调用的结果将有和(1.k,n_k)行,其中键值被复制到每个组的每一个n_k行中,其中key k.然而,模式字段告诉我,这不是处理这个问题的方式--事实上,它意味着它要么希望将结果推入一个行中。
希望这是明确的,尽管是理论上的(很抱歉,我不能分享我的实际代码示例)。有人能验证或解释这样的函数将如何被实际对待吗?
发布于 2016-09-08 16:47:52
关于输入和输出的确切期望在正式文件中有明确的表述
向
SparkDataFrame的每个组应用一个函数。该函数将应用于SparkDataFrame的每一组,并且应该只有两个参数:分组键和对应于该键的Rdata.frame。组是从SparkDataFrames列中选择的。函数的输出应该是data.frame。 架构指定结果SparkDataFrame的行格式。它必须根据星区数据类型来表示R函数的输出模式。返回的data.frame的列名由用户设置。下面是R和Spark之间的数据类型映射。
换句话说,您的函数应该使用对应于该键的行的key和data.frame,并返回可以使用Spark类型表示的data.frame,该模式提供了作为schema参数的模式。对行数没有限制。例如,您可以按以下方式应用身份转换:
df <- as.DataFrame(iris)
gapply(df, "Species", function(k, x) x, schema(df))与聚合的方式相同:
gapply(df, "Species",
function(k, x) {
dplyr::summarize(dplyr::group_by(x, Species), max(Sepal_Width))
},
structType(
structField("species", "string"),
structField("max_s_width", "double"))
)尽管实际上您应该更喜欢直接在DataFrame (groupBy %>% agg)上进行聚合。
https://stackoverflow.com/questions/39395182
复制相似问题