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

时间:2015-08-23 09:23:55

标签: 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)])

现在假设我想要加入/合并df3df1来创建df2

我试过

df1.join(df2, df1.name == df2.name, 'outer')

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

我该怎么做?或者是否有更好的方法可以从df3df1创建df2

3 个答案:

答案 0 :(得分:9)

您可以使用Spring docs函数返回第一个非空参数。

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"))

答案 1 :(得分:5)

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

df1.join(df2, 'name', 'outer')

答案 2 :(得分:1)

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

以这种方式加入将防止名称列的重复。 https://docs.databricks.com/spark/latest/faq/join-two-dataframes-duplicated-column.html