繁体   English   中英

如何对PySpark中的dataframe进行分组过滤

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM