我希望将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?
答案 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]]