在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数据帧在单台计算机上运行。因此,它不适合大数据集。在函数2中,不需要将火花数据帧转换为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+存活