在Scala的Spark SQL中追加增量更新的最有效方法是什么?
我有一个员工数据框E1
,该数据框是用主键empId
存档的。
我还有一个最新的员工数据框,只想将更新的,新的和删除的数据写回到归档数据框。
例如:
员工已存档:
EmpId, EmpName
1 Tom
2 Harry
最近的员工:
EmpId, EmpName
2 Harry Lewis
3 Hermoine
差异应返回:
EmpId, EmpName, deleted
1 Tom yes
2 Harry Lewis no
3 Hermoine no
答案 0 :(得分:0)
如果只想查找更新的行或新的行,则可以使用except
,但是,由于应该显示已删除的行,所以它有点复杂。假设E1
是已归档的员工数据帧,而E2
是最近的员工数据帧,则可以在Scala中使用完全联接,如下所示:
E1.withColumnRenamed("EmpName", "EmpNameOld")
.join(E2, Seq("EmpId"), "fullouter")
.where($"EmpName".isNull || $"EmpNameOld".isNull || $"EmpName" =!= $"EmpNameOld")
.withColumn("deleted", when($"EmpName".isNull, "yes").otherwise("no"))
.withColumn("EmpName", coalesce($"EmpName", $"EmpNameOld"))
.drop("EmpNameOld")
这将为您提供所需的结果,其中包含更新的行,新的行和已删除的行。