python pySpark -可为空列上的连接,条件连接

ulydmbyx  于 2023-03-21  发布在  Python
关注(0)|答案(1)|浏览(118)

我有一个pyspark代码,它在3列上连接两个DF:

final_df = spark_company_df
 .join(
    spark_geo_df,
    (spark_company_df.column1 == spark_geo_df.column1) &
    (spark_company_df.column2 == spark_geo_df.column2) &
    (spark_company_df.column3 == spark_geo_df.column3),
    "left_outer")
  .select(
    spark_geo_df.column1,
    spark_geo_df.column2,
    spark_geo_df.column3)

spark_company_df.column3可以为null,其他两个不能,所以在这些情况下,所有3列在结果DF中都是null。如果3rd为null,则连接2列,如果它不是null,则连接3列,有什么简单的方法吗?某种条件连接。我知道我可以用额外的连接来做,但也许有更好的方法来做?

预期最终DF:

-----------------+--------------------+-------------+-
|column1          |        column2     |      column3|
+-----------------+--------------------+-------------+
|               LA|                  CA|           US|
|               LA|                  CA|           US|
|               SF|                  CA|         null|
+-----------------+--------------------+-------------+

但得到:

-----------------+--------------------+-------------+-
|column1          |        column2     |      column3|
+-----------------+--------------------+-------------+
|               LA|                  CA|           US|
|               LA|                  CA|           US|
|             null|                null|         null|
+-----------------+--------------------+-------------+
yhqotfr8

yhqotfr81#

您可以使用pyspark.sql.Column.eqNullSafe来实现这一点,
你的代码应该是这样的

final_df = spark_company_df
 .join(
    spark_geo_df,
    (spark_company_df.column1 == spark_geo_df.column1) &
    (spark_company_df.column2 == spark_geo_df.column2) &
    (spark_company_df["column3"].eqNullSafe(spark_geo_df["column3"])),
    "left_outer")
  .select(
    spark_geo_df.column1,
    spark_geo_df.column2,
    spark_geo_df.column3)

相关问题