【发布时间】:2018-04-23 18:56:01
【问题描述】:
在spark中,在scala、java和python中有StandardScaler、MinMaxScaler、MaxAbsScaler。 Spark 在 R (SparkR) 中有类似的方法吗?
【问题讨论】:
标签: r dataframe spark-dataframe preprocessor sparkr
在spark中,在scala、java和python中有StandardScaler、MinMaxScaler、MaxAbsScaler。 Spark 在 R (SparkR) 中有类似的方法吗?
【问题讨论】:
标签: r dataframe spark-dataframe preprocessor 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
【讨论】: