簡體   English   中英

根據另一個 dataframe 列值 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

支持_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 )。 其中只有 3 和 6 在value1value2中匹配

我想得到如下結果 dataframe

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

有人可以幫助如何使用 pyspark 實現這一點(我們是否需要編寫用戶定義的 function 或者可以使用連接來完成)?

如果support_df有任何匹配項,則使用左連接和when表達式創建新列cat2_status

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM