0

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

4

1 回答 1

1

有几种可能的解决方案。首先,SparkR 不支持 %in%,但解决此方法的一种天真的方法是如何在 sparkR 中制作新的 DataFrame问题的答案。

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

data <- createDataFrame(sqlContext, df)

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

新数据 <- 过滤器(数据,数据 $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)
于 2015-08-21T06:06:30.430 回答