spark中,scala、java、python中有StandardScaler、MinMaxScaler、MaxAbsScaler。 Spark 在 R (SparkR) 中是否有类似的方法?
最佳答案
在 Spark 2.2.0 或 2.1.0 中,提供了 scala、java 和 python 中数据预处理所必需的缩放器。但 R (SparkR) 中还没有可用的缩放器。因此,我编写了两个缩放数据框列的函数。
函数1:
# max abs scaler function (R dataframe to Spark Dataframe)
maxabsscaler <- function(df, cols, scalingUpperLimit){
for(i in cols){
max <- max(df[i])
df[i] <- (df[, c(i)] / max) * scalingUpperLimit
}
return(as.DataFrame(df))
}
功能2:
# max abs scaler function (Only Spark Dataframe)
maxabsscaler2 <- function(df, cols, scalingUpperLimit){
createOrReplaceTempView(df, "df_tmp")
for(i in columns){
max <- collect(sql(paste("SELECT MAX(", i ,") FROM df_tmp")))[[1]]
df[[i]] <- df[[i]] / max * scalingUpperLimit
}
return(df)
}
注意: Function1 适合您的桌面应用程序或测试环境,因为当您调用此函数时,您需要将 Spark 数据帧转换为 R 数据帧。 R 数据框在单台计算机上运行。因此,它不适合大数据集。在Function2中,不需要将spark数据帧转换为R数据帧。因此,您可以将此功能部署到您的生产环境中。函数无法处理 NA 值。但你可以改进它们。你需要指定列和scalingUpperLimit(100、10、1等)参数。
示例用法:
survival_of_patients <- read.df("D:\\projects\\R\\data\\survival_of_patients.csv", "csv", header = "true")
trainTest <-randomSplit(survival_of_patients, c(0.8, 0.2), 42)
train = trainTest[[1]]
test = trainTest[[2]]
columns <- colnames(as.data.frame(train))[!colnames(as.data.frame(train)) %in% c("SurvivalStatus")]
train <- maxabsscaler(as.data.frame(train), columns, 10)
test <- maxabsscaler(as.data.frame(test), columns, 10)
# or
# train <- maxabsscaler2(train, columns, 10)
# test <- maxabsscaler2(test, columns, 10)
您可以下载该数据集并测试功能。 https://archive.ics.uci.edu/ml/datasets/Haberman%27s+Survival
关于r - SparkR(Spark 2.1.0 或 2.2.0)中有 MaxAbsScaler 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47224579/