将函数一次应用于SparkDataFrame的多个列 [英] Apply a function to multiple columns of a SparkDataFrame, at once

查看:14
本文介绍了将函数一次应用于SparkDataFrame的多个列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Basic R中,我使用data.table

将函数一次应用于多个列
d <- data.table(V1 = rep(1:2, 4:3), V2 = c(1, 2, 4, 5, 2, 3, 4), V3 = 1:7, V4 = sample(letters, 7))
Cols <- c("V2", "V3")
d[, (Cols) := lapply(.SD, function(x) x * 100), .SDcols = Cols]

但现在,我正在尝试使用SparkR在Azure数据库中的SparkDataFrame上复制相同的内容。

我查看了spark.lapplydapply, ...一侧,但我想不出如何将同一函数应用于SparkDataFrame的多个列。

推荐答案

您可以使用SparkR::colnames函数将列名提取为列表,然后在该列表上使用base::lapply。请注意,lapply中的函数参数必须将列用作Spark列对象(SparkR::column)。示例如下:

df <- data.frame(v1 = c(1:3), v2 = c(3:5), v3 = c(8:10))
sdf <- SparkR::createDataFrame(df)
cols <- SparkR::colnames(sdf)
modify_cols <- c("v2", "v3")
spark_cols_new <- lapply(cols, function(x) { 
    if (!x %in% modify_cols){
      SparkR::column(x)
    } else {
      SparkR::alias(SparkR::column(x) * SparkR::lit(100), x)
    }
})
sdf_new <- SparkR::select(sdf, spark_cols_new)

请注意,如果您打算使用常量,则可以直接提供它,而不是使用SparkR::lit函数,但这是一个更安全的选择。

这篇关于将函数一次应用于SparkDataFrame的多个列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆