更快捷地在sparkR中使用过滤器

时间:2015-08-20 10:47:35

标签: sparkr

我有一个包含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需要时间。必须有一个更聪明,更简单的方法来做到这一点?

1 个答案:

答案 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)