如何在 sparkR 中创建一个新的 DataFrame

How to make a new DataFrame in sparkR

在 sparkR 中,我有 data 作为 DataFrame。 我可以像这样在 data 中附加一个条目:

newdata <- filter(data, data$column == 1)

如何附加多个?
假设我想附加向量 list <- c(1,6,10,11,14) 中的所有元素,或者如果 list 是 DataFrame 1 6 10 11 14.

newdata <- filter(data, data$column == list)

如果我这样做,我会得到一个错误。

== 列表将不起作用,%in% 列表也不会更有意义,但您可以按如下方式进行(我提供了一个示例 data.frame):

dataLocal <- data.frame(column=c(rep(1,10),rep(2,10),rep(3,10)),column2=1:30)
data      <- createDataFrame(sqlContext,dataLocal)
newdata   <- filter(data, (data$column == 1)|(data$column == 2))

或更多(现在你的 list2 可以是任意长度)

list2 <- c(1,2)
listEquals  <- paste("(data$column == ",list2,")",sep="")
checkEquals <- paste(listEquals,collapse="|")
func  <- paste("filter(data, ",checkEquals,")",sep="")
newdata <- eval(parse(text=func))

别忘了运行

collect(newdata)

查看结果。

如果您最终试图通过唯一值列表过滤 spark DataFrame,您可以使用 merge 操作来完成此操作。如果您正在谈论从长数据格式到宽数据格式,您需要确保您正在考虑的因子变量的每个 'level' 都有相同数量的观察值。如果你想按列对 Spark 数据帧进行子集化,你也可以使用 select 语句,或者通过将 data$blah 粘贴到 select 语句中构建一个 select 语句,然后执行 eval(parse(text=bigTextObject)) as @瓦内斯建议道。也许生成大 select 语句的函数就是您想要的(如果您按列名过滤)...如果您尝试从单个列中提取值,则 merge 就是您想要的.

据我了解,您似乎想要采用包含很多列的大型 Spark DataFrame,并且只采用您感兴趣的那些,如问题中的 list 所示。

这里有一个生成 spark select 语句的小函数:

list<- c(1,2,5,8,90,200)
listWithDataPrePended<- paste0('data', '$', list)
gettingCloser<- noquote(paste0(listWithDataPrePended, collapse = ','))
finalSelectStatement<- noquote(paste("select(data,", gettingCloser, ")"))
finalData<- eval(parse(text=finalSelectStatement))
finalData<- SparkR::collect(finalData)

也许这就是您要找的...也许不是。尽管如此,我希望它有所帮助。

祝你好运, 奈特