如何将计算列添加到源 DataFrame

Posted

技术标签:

【中文标题】如何将计算列添加到源 DataFrame【英文标题】:How to add calculated columns to the source DataFrame 【发布时间】:2021-06-26 21:04:54 【问题描述】:

在 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
  )

这里的源数据框 - df - 用于生成一个新的 - result - 结果 - mean_b for key_akey_c。 这工作正常,但是如何在不创建新数据框的情况下执行相同的操作?这样 mean_b 会作为新列添加到 df 吗?

【问题讨论】:

你试过df &lt;- gapplyCollect(而不是result &lt;- gapplyCollect(吗? @AlexOtt - 是的,它被 colnames 部分中的内容覆盖: colnames(y) 【参考方案1】:

左连接可以使用聚合键将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 代替它返回像 df 这样的 Spark 数据帧。它还需要生成的 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

现在您可以连接两个 Spark Dataframe:

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

【讨论】:

以上是关于如何将计算列添加到源 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

无法将本机 .dll 引用添加到源生成器项目

如何在 INSERT 语句中使用存储过程的 OUTPUT?

javascript 将变体转移到另一页(在源页面上保留副本)。将以下功能添加到源页面的控制台。网络

如何将计算列添加到 django 模型的列表页面?

避免指定模式两次(Spark/scala)

如何将一个表与另一个表连接,然后计算非空列并将它们按另外两个字段分组?