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