SparkR gapply - 函数返回一个多行R数据帧

时间:2016-09-08 15:42:04

标签: r apache-spark sparkr gapply

假设我想按如下方式执行:

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行复制密钥值...但是,模式字段向我建议这不是如何处理的 - 实际上它表明它要么想要结果推到一排。

希望这很清楚,虽然是理论上的(对不起,我不能分享我的实际代码示例)。有人可以验证或解释如何实际处理这样的功能吗?

1 个答案:

答案 0 :(得分:0)

the official documentation中明确说明了对输入和输出的准确预期:

  

将函数应用于SparkDataFrame的每个组。该函数将应用于SparkDataFrame的每个组,并且应该只有两个参数:分组键和与该键对应的R data.frame。这些组选自SparkDataFrames列。函数的输出应为data.frame

     

Schema指定结果SparkDataFrame的行格式。它必须基于Spark数据类型表示R函数的输出模式。返回的data.frame的列名由用户设置。下面是R和Spark之间的数据类型映射。

换句话说,您的函数应该使用与该键对应的keydata.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)上进行汇总。