【发布时间】:2021-09-17 09:52:55
【问题描述】:
我有一个 PySpark 数据框 df,如下所示:
+---------+----------+--------+-----+------+------+
|firstname|middlename|lastname|id |gender|salary|
+---------+----------+--------+-----+------+------+
|James | |Smith |36636|M |3000 |
|Michael |Rose | |40288|M |4000 |
|Robert | |Williams|42114|M |4000 |
|Maria |Anne |Jones |39192|F |4000 |
|Jen |Mary |Brown |30001|F |2000 |
+---------+----------+--------+-----+------+------+
我只需要对 gender = M 应用 id > 4000 过滤器,并保留所有 gender = F。因此,最终的数据框应如下所示:
+---------+----------+--------+-----+------+------+
|firstname|middlename|lastname|id |gender|salary|
+---------+----------+--------+-----+------+------+
|Michael |Rose | |40288|M |4000 |
|Robert | |Williams|42114|M |4000 |
|Maria |Anne |Jones |39192|F |4000 |
|Jen |Mary |Brown |30001|F |2000 |
+---------+----------+--------+-----+------+------+
我能想到的唯一方法是:
df_temp1 = df.filter(df.gender == 'F')
df_temp2 = df.where(df.gender == 'M').filter(df.id > 4000)
df = df_temp1.union(df_temp2)
这是最有效的方法吗?我是 Spark 的新手,因此不胜感激!
【问题讨论】:
-
欢迎来到 SO。
df.filter("(gender == 'M' and id > 40000) or gender == 'F'")有帮助吗? -
虽然维尔纳的回答是完美而准确的。我宁愿建议使用您在 Question 中提到的相同内容,至少它更具可读性。因为 Spark 可能最终会做同样的工作/最终会使用 werner 由于 Catalyst 优化而编写的代码。不会有任何性能提升。
-
请使用 filter() 查看下面的答案,如果这对您有帮助,请告诉我们 - 如果您能帮助接受和支持,我们将不胜感激
标签: python-3.x filter pyspark apache-spark-sql