根据另一个数据框列值 pyspark 设置列状态
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: value1
或 support_df: value2
中的任一值匹配。
在上面的例子中,当cat
== cat2
时,support_df中有四行。 main_df
的值是 (9, 3, 11, 6
)。 value1
和 value2
中只有 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|
#+----+----+----+-----------+
我有两个 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: value1
或 support_df: value2
中的任一值匹配。
在上面的例子中,当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 实现这一点(我们需要编写用户定义的函数还是可以使用连接来完成)?
使用左连接和 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|
#+----+----+----+-----------+