Python 外部联接Spark数据帧,具有不相同的联接列,然后合并联接列

Python 外部联接Spark数据帧,具有不相同的联接列,然后合并联接列,python,join,apache-spark,apache-spark-sql,Python,Join,Apache Spark,Apache Spark Sql,假设pySpark中有以下数据帧: df1 = sqlContext.createDataFrame([Row(name='john', age=50), Row(name='james', age=25)]) df2 = sqlContext.createDataFrame([Row(name='john', weight=150), Row(name='mike', weight=115)]) df3 = sqlContext.createDataFrame([Row(name='john'

假设pySpark中有以下数据帧:

df1 = sqlContext.createDataFrame([Row(name='john', age=50), Row(name='james', age=25)])
df2 = sqlContext.createDataFrame([Row(name='john', weight=150), Row(name='mike', weight=115)])
df3 = sqlContext.createDataFrame([Row(name='john', age=50, weight=150), Row(name='james', age=25, weight=None), Row(name='mike', age=None, weight=115)])
现在假设我想通过加入/合并
df1
df2
来创建
df3

我试过了

df1.join(df2, df1.name == df2.name, 'outer')
这并不完全有效,因为它会生成两个名称列。然后,我需要以某种方式组合两个名称列,以便一个名称列中缺少的名称由另一个名称列中缺少的名称填充

我该怎么做?或者有没有更好的方法从
df1
df2
创建
df3

您可以使用返回第一个非空参数的函数

from pyspark.sql.functions import coalesce

df1 = df1.alias("df1")
df2 = df2.alias("df2")

(df1.join(df2, df1.name == df2.name, 'outer')
  .withColumn("name_", coalesce("df1.name", "df2.name"))
  .drop("name")
  .withColumnRenamed("name_", "name"))

这有点晚了,但如果有人需要,有一个更简单的解决方案。仅需对原始海报的解决方案进行简单更改:

df1.join(df2, 'name', 'outer')
以这种方式连接将防止名称列的重复

df3 = df1.join(df2, ['name'], 'outer')