如何在PySpark中对 Dataframe 进行分组和过滤

83qze16e  于 2023-02-07  发布在  Spark
关注(0)|答案(1)|浏览(252)

附件是我的 Dataframe ,我正尝试在pySpark中找到一种方法来过滤没有任何支持处于"In"状态的链接名称。例如,预期输出应该只有Link3,因为与其关联的任何支持都没有处于"In"状态
| 链接名称|支持|现况|
| - ------|- ------|- ------|
| 链接1|支持1|在|
| 链接1|支持2|在|
| 链接1|支助3|出局|
| 链接2|支助4|在|
| 链接2|支助5|在|
| 链接3|支助6|出局|
| 链接3|支助7|出局|
有人能帮帮我吗?
预期输出应该仅为Link3,因为与其关联的所有支持都没有"In"

qyswt5oh

qyswt5oh1#

你可以用窗口函数来做类似的事情

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()

我分组的链接名称和排序的状态组内。如果第一个状态组内排序升序是"出"这意味着"在"状态不存在这样的分区,这就是过滤器正在检查
最后,我只选择链接名称,并调用distinct来获取具有链接名称的单个记录
输出为

+---------+
|Link Name|
+---------+
|    Link3|
+---------+

相关问题