如何覆盖两个数据框以获得如下所示的结果

时间:2019-05-09 17:18:37

标签: apache-spark dataframe pyspark

我有两个通过pyspar的数据帧DF1和DF2。我想要如下输出:

DF1

Id|field_A   |field_B   |field_C |field_D
1 |cat       |12        |black   |1
2 |dog       |128       |white   |2

DF2

Id|field_A|field_B|field_C
1 |cat    |13     |blue

需要的输出:

DF3

Id|field_A|field_B|field_C|field_D
1 |cat    |13     |blue   |1
2 |dog    |128    |white  |2

我已经尝试了联接概念,但不适用于以下联接。

  

“内部”,“外部”,“完整”,“完整外部”,“完整外部”,“左侧外部”,   'left','left_outer','rightouter','right','right_outer',   'leftsemi','left_semi','leftanti','left_anti','cross'

DF3 = DF2.join(DF1, DF1.ID == DF2.ID,"leftouter")

1 个答案:

答案 0 :(得分:0)

首先,您必须为数据框声明别名:

val a = df1.as("a")
val b = df2.as("b")

使用未更新的列创建一个数组

val columnsNotUpdated =
        Seq(col("a.Id").as("Id"), col("a.field_D").as("field_D"))

使用updated的列创建一个数组,并使用何时查看它是否与数据框b交叉(b.Id不为null),以及是否与数据框b交叉,选择数据框'b'的值

 val columnsUpdated = a.columns
        .filter(x => !Array("Id", "field_D").exists(_ == x))
        .map(x =>
          when(col("b.Id").isNotNull, col(f"b.$x").as(x))
            .otherwise(col(f"a.$x").as(x)))

最后,与'left_outer'加入并选择列

a.join(b, col("a.Id") === col("b.Id"), "left_outer")
        .select(columnsNotUpdated.union(columnsUpdated): _*)

所有代码是:

val a = df1.as("a")
      val b = df2.as("b")

      val columnsNotUpdated =
        Seq(col("a.Id").as("Id"), col("a.field_D").as("field_D"))

      val columnsUpdated = a.columns
        .filter(x => !Array("Id", "field_D").exists(_ == x))
        .map(x =>
          when(col("b.Id").isNotNull, col(f"b.$x").as(x))
            .otherwise(col(f"a.$x").as(x)))

      a.join(b, col("a.Id") === col("b.Id"), "left_outer")
        .select(columnsNotUpdated.union(columnsUpdated): _*)