Pyspark sql:根据一个值是否存在于另一个DataFrame的列

时间:2018-05-30 13:35:37

标签: python apache-spark pyspark pyspark-sql

我试图关注this answer,但我的问题略有不同。

我有两个pyspark数据框df2bears2。两者都有一个整数变量,我想创建一个像这个伪代码的布尔值:

df3 = df2.withColumn("game", (df2.week_id.isin(bears2.week_if), 1,0))

基本上,如果df2的相应列中存在bears2的值,我想要1其他0

我尝试了另一个问题的expr(),但无法让它发挥作用。它看起来像这样:

new_column_1 = F.expr(
    """IF(df2.week_id IN(bears2.week_if), 1, 0))"""
    )

1 个答案:

答案 0 :(得分:1)

您目前无法使用pyspark-sql 1 这样的IN。相反,您必须加入DataFrame。

尝试类似:

from pyspark.sql.functions import col, when
df3 = df2.withColumn("id", col("week_id")).alias("df2")\
    .join(bears2.withColumn("id", col("week_if")).alias("bears2"), on="id", how="left")\
    .select("df2.*", when(col("bears2.id").isNotNull(), 1).otherwise(0))

要使联接起作用,联接键列必须存在于两个DataFrame中。出于这个原因,我首先调用withColumn("id", ...)将列重命名为连接的相同值。

接下来,我们进行LEFT联接以保留df2中的所有列。最后,我们选择df2中的所有列,并使用pyspark.sql.functions.when()创建布尔列。

when()的第一个参数是一个条件。如果是True,则返回第二个参数。如果不是,则使用otherwise()中的值。