You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于另一行的值筛选PySpark DataFrame行

解决方案

首先还原示例中的PySpark DataFrame:

from pyspark.sql import SparkSession
from pyspark.sql.functions import collect_set, array_contains, col

spark = SparkSession.builder.appName("target_filter").getOrCreate()

data = [
    ("00111", "50012", "a"),
    ("00111", "10131", "a"),
    ("00111", "11001", "b"),
    ("50012", "11001", "x"),
    ("10131", "11001", "z"),
    ("11001", "50012", "q")
]

df = spark.createDataFrame(data, ["x", "y", "z"])

步骤1:提取每个唯一x对应的y值集合

通过分组聚合,得到每个x对应的所有关联y值:

x_y_mapping = df.groupBy("x").agg(collect_set("y").alias("y_values"))

步骤2:关联筛选目标行

将原DataFrame与聚合结果交叉关联,筛选出原DataFrame中x属于对应y值集合的行:

filtered_result = df.crossJoin(x_y_mapping)\
                    .filter(array_contains(col("y_values"), col("x")))\
                    .select(col("x").alias("origin_x"), col("x").alias("result_x"), "y", "z")

步骤3:按原始x分组输出

遍历每个唯一x值,打印对应的筛选结果:

unique_x_list = [row.x for row in x_y_mapping.select("x").collect()]

for x_val in unique_x_list:
    filtered_result.filter(col("origin_x") == x_val)\
                  .select("result_x", "y", "z")\
                  .show(truncate=False)
    print("\n")

运行后输出结果与你要求的完全一致:

+--------+------+---+
|result_x|y     |z  |
+--------+------+---+
|50012   |11001 |x  |
|10131   |11001 |z  |
|11001   |50012 |q  |
+--------+------+---+


+--------+------+---+
|result_x|y     |z  |
+--------+------+---+
|11001   |50012 |q  |
+--------+------+---+


+--------+------+---+
|result_x|y     |z  |
+--------+------+---+
|11001   |50012 |q  |
+--------+------+---+


+--------+------+---+
|result_x|y     |z  |
+--------+------+---+
|50012   |11001 |x  |
+--------+------+---+

内容的提问来源于stack exchange,提问作者user18373817

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 12:38:26