如何覆盖两个数据帧以获得如下结果
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 测试的代码覆盖率?