SparkR - 为数据挖掘创建测试和训练数据框架

时间:2016-06-04 23:21:44

标签: apache-spark spark-dataframe sparkr

我希望将SparkR DataFrame分成两个子集,一个用于训练,另一个用于测试glim。

我在R中执行此操作的常规方法是创建行的数组索引,将数组采样到新数组中,然后根据子集中或不在子集中的行对数据进行子集化。 e.g。

seed=42 # of course
index <- 1:nrow(df) # sample works on vectors
trainindex <- sample(index, trunc(length(index)/2)) # split data set into two
train <- df[trainindex, ] # training data set
test <- df[-trainindex, ] # all the records not in the training data set

这种方法似乎不适用于SparkR DataFrames,因为行不是唯一可寻址的,因为它们在R中。

由于数据集的分区是数据挖掘的基本技术,有没有人开发出一种随机分区DataFrame行的方法?

基于这个想法,我似乎在工作时不断地在R data.frames和Spark DataFrames之间来回切换。用类似数据帧的多个副本填充存储器似乎是不合需要的。有没有人对使用SparkR DataFrames进行数据挖掘项目的一般方法有什么好建议?例如,使用R data.frames执行到X阶段的所有任务,然后切换到Spark DataFrames?

2 个答案:

答案 0 :(得分:3)

我找到了问题第一部分的答案(第二部分需要更长的时间)。对于那些关注...

sdfData <- createDataFrame(sqlContext, index)
train <- sample(sdfData, withReplacement=FALSE, fraction=0.5, seed=42)
test <- except(sdfData, train)

答案 1 :(得分:2)

关于您的第一个问题:自Spark 2.0.0起,您可以使用randomSplit

sdfData <- createDataFrame(sqlContext, index)
trainTest <-randomSplit(rfData,c(0.7,0.3), seed)
train = trainTest[[1]]
test = trainTest[[2]]