假设我想按如下方式执行:
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))
}
)
其中函数的返回有多行。为了清楚起见,文档中的示例(遗憾地回应了Spark文档的大部分内容,其中的示例非常简单)并不能帮助我确定是否会像我期望的那样处理它。
我希望这个结果是,对于在DataFrame中创建的k组,每组有n_k个输出行,gapply()调用的结果将是sum(1..k,n_k)行,其中,为密钥k中的每个组的每个n_k行复制密钥值...但是,模式字段向我建议这不是如何处理的 - 实际上它表明它要么想要结果推到一排。
希望这很清楚,虽然是理论上的(对不起,我不能分享我的实际代码示例)。有人可以验证或解释如何实际处理这样的功能吗?
答案 0 :(得分:0)
the official documentation中明确说明了对输入和输出的准确预期:
将函数应用于
SparkDataFrame
的每个组。该函数将应用于SparkDataFrame的每个组,并且应该只有两个参数:分组键和与该键对应的Rdata.frame
。这些组选自SparkDataFrames
列。函数的输出应为data.frame
。Schema指定结果
SparkDataFrame
的行格式。它必须基于Spark数据类型表示R函数的输出模式。返回的data.frame
的列名由用户设置。下面是R和Spark之间的数据类型映射。
换句话说,您的函数应该使用与该键对应的key
和data.frame
行,并返回可以使用Spark SQL类型表示的data.frame
,其架构为{{1}参数。行数没有限制。例如,您可以按如下方式应用身份转换:
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
)上进行汇总。