繁体   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