使用不同的连接列外连接 Spark 数据框,然后合并连接列
Outer join Spark dataframe with non-identical join column and then merge join column
假设我在 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)])
现在假设我想从 joining/merging df1
和 df2
.
创建 df3
我试过
df1.join(df2, df1.name == df2.name, 'outer')
这并不是完全有效,因为它会生成两个名称列。然后我需要以某种方式组合两个名称列,以便一个名称列中缺少的名称由另一个名称列中缺少的名称填充。
我该怎么做?或者是否有更好的方法从 df1
和 df2
创建 df3
?
您可以使用 coallesce
函数,其中 returns 第一个非空参数。
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')
以这种方式加入将防止名称列重复。 https://kb.databricks.com/data/join-two-dataframes-duplicated-columns.html
假设我在 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)])
现在假设我想从 joining/merging df1
和 df2
.
df3
我试过
df1.join(df2, df1.name == df2.name, 'outer')
这并不是完全有效,因为它会生成两个名称列。然后我需要以某种方式组合两个名称列,以便一个名称列中缺少的名称由另一个名称列中缺少的名称填充。
我该怎么做?或者是否有更好的方法从 df1
和 df2
创建 df3
?
您可以使用 coallesce
函数,其中 returns 第一个非空参数。
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')
以这种方式加入将防止名称列重复。 https://kb.databricks.com/data/join-two-dataframes-duplicated-columns.html