在 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 之间转换 [重复]

java的怎么操作spark的dataframe

在 Apache Spark 中拆分 DataFrame

[Spark][Python][DataFrame][SQL]Spark对DataFrame直接执行SQL处理的例子

您可以将 Spark Dataframe 嵌套在另一个 Dataframe 中吗?