如何覆盖两个数据帧以获得如下结果

Posted

技术标签:

【中文标题】如何覆盖两个数据帧以获得如下结果【英文标题】:How to overwrite two dataframe in get the result like below 【发布时间】:2019-05-09 17:18:36 【问题描述】:

我通过 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

我已经尝试过加入概念,但它不能通过下面的加入工作。

'inner', 'outer', 'full', 'fullouter', 'full_outer', 'leftouter', 'left'、'left_outer'、'rightouter'、'right'、'right_outer'、 'leftsemi'、'left_semi'、'leftanti'、'left_anti'、'cross'

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

【问题讨论】:

能否请您正确格式化代码,以便我可以提供帮助 update a dataframe column with new values的可能重复 【参考方案1】:

首先,您必须为 Dataframes 声明别名:

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

用更新的列创建一个数组,并使用when来查看它是否与数据框b交叉(b.Id不为空),如果交叉,则选择数据框'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): _*)

【讨论】:

感谢您的回答.. 让我尝试在 pyspark 中转换

以上是关于如何覆盖两个数据帧以获得如下结果的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Android 获得 AWS Device Farm 测试的代码覆盖率?

如何关闭声纳分析仪但仍然获得覆盖率报告?

如何通过VBA覆盖获得智能感知

如何获得 scala 项目的 SonarQube 代码覆盖率

如何覆盖另一个表中的行?

在循环内附加数据框