一次将函数应用于 SparkDataFrame 的多个列

Apply a function to multiple columns of a SparkDataFrame, at once

在基本 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]

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

我查看了 dapply, ...spark.lapply 的一侧,但我不知道如何将相同的函数应用于 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 函数,但这是更安全的选择。