如何将计算列添加到源Dataframe

l7wslrjt  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(392)

在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中?

kqqjbcuj

kqqjbcuj1#

左连接可以添加 result$mean_b 作为一个新的栏目 df 使用聚合密钥。
遵守以下代码:

library(SparkR)

df <- createDataFrame (
list(list(1L, 1, "x", 0.1), list(1L, 2, "x", 0.2), list(3L, 3, "y", 0.3)),
  c("a", "b", "c", "d"))

result_schema <- structType(
  structField("key_a", "integer"),
  structField("key_c", "string"),
  structField("mean_b", "double"))

result <- gapply(
  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
  },
  result_schema)

注意,我稍微更改了 df 因为你把数字当作字符串。此外,还有 gapply 而是使用返回sparkDataframe,如 df . 它还需要结果df的模式。总而言之: df :

a b c   d
1 1 1 x 0.1
2 1 2 x 0.2
3 3 3 y 0.3
``` `result` :

key_a key_c mean_b
1 1 x 1.5
2 3 y 3.0

现在可以连接两个sparkDataframe:

df2 <- join(df, result, (df$a == result$key_a) & (df$c == result$key_c), "left")
collect(drop(df2, c("key_a", "key_c")))

额外的列可以用 `drop` 数据返回给司机 `collect` :

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

相关问题