我有两个通过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")
答案 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): _*)