2015-08-23 56 views
3

假設我有pySpark以下dataframes:外連接具有不相同聯接列星火數據框中,然後合併聯接列

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

現在假設我想從加入/合併df1df2創建df3

我試着做

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

這並不完全準確地工作,因爲它產生兩個名稱列。然後,我需要以某種方式組合這兩個名稱列,以便從一個名稱列中缺少的名稱由來自其他名稱列的缺少名稱填充。

我該怎麼做?或者有更好的方法來創建從df1df2df3

回答

7

您可以使用coallesce函數返回第一個非空參數。

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

這有點晚了,但如果有人需要它,有一個更簡單的解決方案。從樓主的解決方案只是一個簡單的變化:

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