簡體   English   中英

檢查 PySaprk 列值是否存在於另一個 dataframe 列值中

[英]Check if PySaprk column values exists in another dataframe column values

我試圖找出條件來檢查一個 PySpark dataframe 的值是否存在於另一個 PySpark dataframe 中,如果存在,則提取該值並再次比較。 我正在考慮使用when() function 執行多個withColumn()

例如我的兩個數據框可以是這樣的:

df1
| id    | value |
| ----- | ----  |
| hello | 1111  |
| world | 2222  |

df2
| id     | value |
| ------ | ----  |
| hello  | 1111  |
| world  | 3333  |
| people | 2222  |

我希望獲得的結果是首先檢查df1.id的值是否存在於df2.id中,如果為真,則返回df2.value ,例如我正在嘗試類似的方法:

df1 = df1.withColumn("df2_value", when(df1.id == df2.id, df2.value))

所以我得到類似的東西:

df1
| id    | value | df2_value |
| ----- | ----  | --------- |
| hello | 1111  | 1111      |
| world | 2222  | 3333      |

所以現在我可以在df1 dataframe 中的這兩個值列之間進行另一次檢查,並在新的 dataframe 中返回 boolean 列( 10 )。

我希望得到的結果是這樣的:

df3
| id    | value | df2_value | match |
| ----- | ----  | --------- | ----- |
| hello | 1111  | 1111      | 1     |
| world | 2222  | 3333      | 0     |

在為除id之外的所有 df2 列加上df2_*前綴后,在id上左連接df1df2

from pyspark.sql import functions as F

df1 = spark.createDataFrame([("hello", 1111), ("world", 2222)], ["id", "value"])
df2 = spark.createDataFrame([("hello", 1111), ("world", 3333), ("people", 2222)], ["id", "value"])

df = df1.join(
    df2.select("id", *[F.col(c).alias(f"df2_{c}") for c in df2.columns if c != 'id']),
    ["id"],
    "left"
)

然后使用functools.reduce你可以構建一個 boolean 表達式來檢查列是否在 2 個數據框中匹配,如下所示:

from functools import reduce

check_expr = reduce(
    lambda acc, x: acc & (F.col(x) == F.col(f"df2_{x}")),
    [c for c in df1.columns if c != 'id'],
    F.lit(True)
)
    
df.withColumn("match", check_expr.cast("int")).show()
#+-----+-----+---------+-----+
#|   id|value|df2_value|match|
#+-----+-----+---------+-----+
#|hello| 1111|     1111|    1|
#|world| 2222|     3333|    0|
#+-----+-----+---------+-----+

暫無
暫無

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

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