我有两个 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
中的值是否与 cat
或 cat2
中的值匹配。
在上面的例子中,当cat
== cat2
时,support_df中有四行。来自 main_df
的值是 (9, 3, 11, 6
)。其中 value1
和 value2
我想要一个如下的结果数据框
cat1 cat2 cat3 cat2_status
a 9 e NotMatched
b 3 f Matched
c 11 g NotMatched
d 6 h Matched
有人可以帮助使用 pyspark 来实现这一点吗(我们需要编写用户定义的函数还是可以使用 joins 来完成)?
答案 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|
#+----+----+----+-----------+