微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将计算列添加到源 DataFrame

如何解决如何将计算列添加到源 DataFrame

在 SparkR (Databricks) 中,我可以根据 A 列和 C 列的分组值计算 B 列的平均值,如下所示:

library(SparkR)

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

result <- gapplyCollect(
  df,"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 用于 >key_akey_c。 这工作正常,但是如何在不创建新数据框的情况下执行相同的操作?以便将 mean_b 作为新列添加df

解决方法

左连接可以使用聚合键将 result$mean_b 作为新列添加到原始 df

观察以下代码:

library(SparkR)

df <- createDataFrame (
list(list(1L,1,"x",0.1),list(1L,2,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"),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 代替它返回一个 Spark Dataframe,如 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

现在您可以连接两个 Spark 数据帧:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。