在 Spark Dataframe (Pyspark) 中提取与特定条件匹配的第一个“行集”
Posted
技术标签:
【中文标题】在 Spark Dataframe (Pyspark) 中提取与特定条件匹配的第一个“行集”【英文标题】:Extract first "set of rows" matching a particular condition in Spark Dataframe (Pyspark) 【发布时间】:2016-12-15 14:20:25 【问题描述】:我有一个 Spark DataFrame,其数据如下:
ID | UseCase
-----------------
0 | Unidentified
1 | Unidentified
2 | Unidentified
3 | Unidentified
4 | UseCase1
5 | UseCase1
6 | Unidentified
7 | Unidentified
8 | UseCase2
9 | UseCase2
10 | UseCase2
11 | Unidentified
12 | Unidentified
我必须在UseCase
列中提取具有值Unidentified
的前4 行,并对其进行进一步处理。此时,我不想得到带有Unidentified
值的中间和最后两行。
我想避免使用ID
列,因为它们不是固定的。以上数据只是一个样本。
当我使用 map 函数(将其转换为 RDD 之后)或 UDF 时,我的输出 DataFrame 中最终有 8 行(这些函数是预期的)。
如何做到这一点?我在 PySpark 工作。我不想在 DataFrame 上使用 collect 并将其作为列表进行迭代。这将违背 Spark 的目的。 DataFrame 的大小可以达到 4-5 GB。
您能否建议如何做到这一点? 提前致谢!
【问题讨论】:
当您说“前四行”时,您的意思是您想要按 ID 排序的前 4 行? 抱歉不清楚。我需要从 DataFrame 中获取前 'n' 行,这些行在 UseCase 列下具有Unidentified
的值。
是的,但是“第一”是什么意思?如果 DataFrame 没有排序,“first”是一个不确定的概念。您想要随机选择的第一行还是根据某些排序规则的第一行?
我正在尝试获取“UseCase”值为“Unidentified”的行。在此示例中,我将提取前四行并对其进行处理。处理后,'UseCase;列将替换为适当的 UseCase(如 4 中所示)。
好的,那么,当按 ID 排序时,您希望得到 all 行开头为 Unidentified as UseCase 的行,对吗?所以如果第一行有一个有效的用例,你就不拿了吗?
【参考方案1】:
只需做一个过滤器和一个限制。下面的代码是Scala,但你会明白重点。
假设你的数据框叫做 df,那么:
df.filter($"UseCase"==="Unidentified").limit(4).collect()
【讨论】:
以上是关于在 Spark Dataframe (Pyspark) 中提取与特定条件匹配的第一个“行集”的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Mongo Spark 连接器为查询返回不同且不正确的计数?
在 spark.SQL DataFrame 和 pandas DataFrame 之间转换 [重复]