在sparkr(databricks)中,我可以根据a列和c列的分组值计算b列的平均值,如下所示:
library(SparkR)
df <- createDataFrame (
list(list(1L, 1, "1", 0.1), list(1L, 2, "1", 0.2), list(3L, 3, "3", 0.3)),
c("a", "b", "c", "d"))
result <- gapplyCollect(
df,
c("a", "c"),
function(key, x) {
y <- data.frame(key, mean(x$b), stringsAsFactors = FALSE)
colnames(y) <- c( "key_a", "key_c", "mean_b")
y
})
这里,源Dataframedf用于生成一个新的结果,结果是key a和key c的mean_b。这工作正常,但是如何在不创建新Dataframe的情况下执行相同的操作呢?所以这意味着把b作为一个新的列添加到df中?
1条答案
按热度按时间kqqjbcuj1#
左连接可以添加
result$mean_b
作为一个新的栏目df
使用聚合密钥。遵守以下代码:
注意,我稍微更改了
df
因为你把数字当作字符串。此外,还有gapply
而是使用返回sparkDataframe,如df
. 它还需要结果df的模式。总而言之:df
:key_a key_c mean_b
1 1 x 1.5
2 3 y 3.0
df2 <- join(df, result, (df$a == result$key_a) & (df$c == result$key_c), "left")
collect(drop(df2, c("key_a", "key_c")))
a b c d mean_b
1 1 1 x 0.1 1.5
2 1 2 x 0.2 1.5
3 3 3 y 0.3 3.0