在 sparkR 中使用过滤器的更快方法

Faster way to use filter in sparkR

我有一个包含 user_id 的 DataFrame 'data'。要获得所有 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 可能需要一些时间。必须有一种更聪明、更简单的方法来做到这一点吗?

有几种可能的解决方案。首先 %in% 在 SparkR 中不受支持,但解决此方法的一种天真的方法是问题 .

的答案

对于其他方法,我提供了一个最简单的 DataFrame 示例: df <- data.frame(ID = c(1,2,3,4), 年龄 = c(21,23,33,21))

data <- createDataFrame(sqlContext, df)

第二种方法仅在您想要获取第一个 ID(或至少是连续的 ID)时才有效。然后你可以进行以下操作

newdata <- filter(data, data$ID < 3) 收集(新数据)

更一般地说,您可以将您的数据与您想要保留的 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)