根据另一个数据框列值 p​​yspark 设置列状态

Set column status based on another dataframe column value pyspark

我有两个 pyspark 数据框,如下所示

main_df:

cat1 cat2 cat3
 a    9     e
 b    3     f
 c    11    g
 d    6     h

support_df:

cat value1 value2
cat1   1      2
cat1   3      4
cat1   5      6
cat1   7      8
cat2   1      2
cat2   3      4
cat2   5      6
cat2   7      8

cat 列为 cat2 时,我需要检查 main_df: cat2 中的值是否与 support_df: value1support_df: value2 中的任一值匹配。

在上面的例子中,当cat == cat2时,support_df中有四行。 main_df 的值是 (9, 3, 11, 6)。 value1value2

中只有 3 和 6 个匹配

我想要一个如下所示的结果数据框

cat1 cat2 cat3 cat2_status
 a    9     e    NotMatched
 b    3     f    Matched
 c    11    g    NotMatched
 d    6     h    Matched

有人可以帮助解决如何使用 pyspark 实现这一点(我们需要编写用户定义的函数还是可以使用连接来完成)?

使用左连接和 when 表达式创建新列 cat2_status 如果在 support_df 上有任何匹配:

from pyspark.sql import functions as F


result = main_df.alias("main").join(
    support_df.alias("supp"),
    (F.col("supp.cat") == "cat2") &
    ((F.col("main.cat2") == F.col("supp.value1")) |
     (F.col("main.cat2") == F.col("supp.value2"))),
    "left"
).select(
    "main.*",
    F.when(
        F.col("supp.cat").isNotNull(), "Matched"
    ).otherwise("NotMatched").alias("cat2_status")
)

result.show()

#+----+----+----+-----------+
#|cat1|cat2|cat3|cat2_status|
#+----+----+----+-----------+
#|   a|   9|   e| NotMatched|
#|   b|   3|   f|    Matched|
#|   c|  11|   g| NotMatched|
#|   d|   6|   h|    Matched|
#+----+----+----+-----------+