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

时间:2021-02-15 11:03:05

标签: apache-spark pyspark apache-spark-sql pyspark-dataframes

我有两个 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

main_df: cat2 列为 support_df: value1 时,我需要检查 support_df: value2 中的值是否与 catcat2 中的值匹配。

在上面的例子中,当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 来实现这一点吗(我们需要编写用户定义的函数还是可以使用 joins 来完成)?

1 个答案:

答案 0 :(得分:1)

如果 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|
#+----+----+----+-----------+