一次将函数应用于 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
函数,但这是更安全的选择。
在基本 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
函数,但这是更安全的选择。