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

pla*_*lam 5 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', age=50, weight=150), Row(name='james', age=25, weight=None), Row(name='mike', age=None, weight=115)])
Run Code Online (Sandbox Code Playgroud)

现在假设我想创建df3从加入/合并df1df2.

我试过了

df1.join(df2, df1.name == df2.name, 'outer')
Run Code Online (Sandbox Code Playgroud)

这并不完全正常,因为它产生两个名称列.我需要以某种方式组合两个名称列,以便从一个名称列中缺少的名称由另一个名称列中缺少的名称填充.

我该怎么办?还是有更好的方法来创建df3df1df2

zer*_*323 9

您可以使用coallesce返回第一个非null参数的函数.

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"))
Run Code Online (Sandbox Code Playgroud)


V. *_*mma 5

这有点晚了,但如果有人需要它,有一个更简单的解决方案.只需从原始海报的解决方案中进行简单的更改:

df1.join(df2, 'name', 'outer')
Run Code Online (Sandbox Code Playgroud)