我有一个包含user_id的DataFrame'数据'。要获取所有user_id = 1,我只需执行此操作
filter(data, data$user_id==1)
说我想创建一个新的DataFrame'new_data',其中包含前10个user_id,即user_id = 1,2,3,...,10。
SparkR的一种方法是
newdata <- unionAll(filter(data, data$user_id==1), filter(data, data$user_id==2))
for(j in 3:10){
newdata<- unionAll(newdata, filter(data, data$user_id==j) )
}
这很好用,但是大j需要时间。必须有一个更聪明,更简单的方法来做到这一点?
答案 0 :(得分:1)
有一些可能的解决方案。 SparkR不支持%中的第一个%,但修复此方法的一种天真的方法是问题How to make a new DataFrame in sparkR的答案。
对于其他方法,我提供了一个最小的示例DataFrame: df&lt; - data.frame(ID = c(1,2,3,4), 年龄= c(21,23,33,21))
data <- createDataFrame(sqlContext, df)
第二种方法仅在您想要获取第一个ID(或至少连续ID)时才有效。然后你可以做以下
newdata&lt; - filter(data,data $ ID&lt; 3) 收集(newdata)
更一般地说,您可以使用要保留的ID加入数据。当你想要保留非连续的ID时,这会更容易,但是当你有连续的ID时,它会比以前的方法慢:
toJoin <- data.frame(IDs = c(1,3))
toJoin <- createDataFrame(sqlContext, toJoin)
newdata <- join(data,toJoin, data$ID == toJoin$IDs)
newdata$IDs <- NULL
collect(newdata)