如何对 SparkR 数据框进行子集化

Posted

技术标签:

【中文标题】如何对 SparkR 数据框进行子集化【英文标题】:How to subset SparkR data frame 【发布时间】:2015-07-25 11:26:23 【问题描述】:

假设我们有一个数据集“people”,其中包含 ID 和 Age 作为 2 乘以 3 矩阵。

Id = 1 2 3
Age= 21 18 30

在 sparkR 中,我想创建一个新数据集 people2,其中包含所有 18 岁以上的 ID。在这种情况下,它是 ID 1 和 3。在 sparkR 中我会这样做

people2 <- people$Age > 18

但它不起作用。您将如何创建新数据集?

【问题讨论】:

只是为了记录 people2 &lt;- people$Age &gt; 18 不会创建新的数据框,即使是普通的旧 R data.frame。它只是输出逻辑向量。 【参考方案1】:

您可以在任一条件下使用SparkR::filter

> people <- createDataFrame(sqlContext, data.frame(Id=1:3, Age=c(21, 18, 30)))
> filter(people, people$Age > 18) %>% head()

  Id Age
1  1  21
2  3  30

或 SQL 字符串:

> filter(people, "Age > 18") %>% head()

  Id Age
1  1  21
2  3  30

也可以在注册表上使用SparkR::sql 函数和原始 SQL 查询:

> registerTempTable(people, "people"
> sql(sqlContext, "SELECT * FROM people WHERE Age > 18") %>% head()
  Id Age
1  1  21
2  3  30

【讨论】:

【参考方案2】:

对于那些欣赏 R 的众多选项来完成任何给定任务的人,您还可以使用 SparkR::subset() 函数:

> people <- createDataFrame(sqlContext, data.frame(Id=1:3, Age=c(21, 18, 30)))
> people2 <- subset(people, people$Age > 18, select = c(1,2))
> head(people2)
  Id Age
1  1  21
2  3  30

要回答评论中的其他详细信息:

id <- 1:99
age <- 99:1
myRDF <- data.frame(id, age)
mySparkDF <- createDataFrame(sqlContext, myRDF)

newSparkDF <- subset(mySparkDF, 
        mySparkDF$id==3 | mySparkDF$id==32 | mySparkDF$id==43 | mySparkDF$id==55, 
        select = 1:2)
take(newSparkDF,5)

(1) Spark Jobs
  id age
1  3  97
2 32  68
3 43  57
4 55  45

【讨论】:

感谢您的回复。假设有一个数据集 ID=1,2,3..,99 和 age=22,...,12。如果想将子集设置为 ID 的 3、32、43、55,该怎么做? @Ole - 已更新答案以解决您评论中的扩展问题。

以上是关于如何对 SparkR 数据框进行子集化的主要内容,如果未能解决你的问题,请参考以下文章

如何通过列名的前缀对火花数据框进行子集化?

如何根据应用于大量列的“不等于”标准对数据框进行子集化?

如何在不使用左连接的情况下根据“OR”条件对数据框进行子集化? [复制]

如何使用“OR”组合多个条件以对数据框进行子集化?

如何使用每组的行数作为条件对数据框进行子集化

如何对您的数据框进行子集化以在 R 中保留前 3 个重复行?