簡體   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