[英]How to group and filter a dataframe in PySpark
附件是我的 dataframe,我正试图在 pySpark 中找到一种方法来过滤没有支持状态为“在”的链接名称。 例如。 预期的 output 应该只是 Link3,因为与之关联的支撑都没有“In”
链接名称 | 支持 | 地位 |
---|---|---|
链接1 | 支持1 | 在 |
链接1 | 支持2 | 在 |
链接1 | 支持3 | 出去 |
链接2 | 支持4 | 在 |
链接2 | 支持5 | 在 |
链接3 | 支持6 | 出去 |
链接3 | 支持7 | 出去 |
有人可以帮我吗?
预期的 output 应该只是 Link3,因为与其关联的所有支撑都没有“In”
你可以尝试这样的事情 window function
import pyspark.sql.functions as F
from pyspark.sql import Window
inputData = [
("Link1", "Support1", "In"),
("Link1", "Support2", "In"),
("Link1", "Support3", "Out"),
("Link2", "Support4", "In"),
("Link2", "Support5", "In"),
("Link3", "Support6", "Out"),
("Link3", "Support7", "Out"),
]
inputDf = spark.createDataFrame(inputData, schema=["Link Name", "Support", "Status"])
window = Window.partitionBy("Link Name").orderBy(F.col("Status").asc())
dfWithRank = inputDf.withColumn("dense_rank", F.dense_rank().over(window))
dfWithRank.filter(
(F.col("dense_rank") == F.lit(1)) & (F.col("Status") == F.lit("Out"))
).select("Link Name").distinct().show()
我按链接名称分组并按组内的状态排序。 如果按升序排序的组中的第一个状态是“Out”,则表示此类分区不存在“In”状态,这就是过滤器正在检查的内容
最后,我只选择链接名称并调用 distinct 以获取带有链接名称的单个记录
Output 是
+---------+
|Link Name|
+---------+
| Link3|
+---------+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.