Spark SQL中的增量更新

时间:2018-07-16 20:45:07

标签: apache-spark apache-spark-sql

在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

1 个答案:

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

这将为您提供所需的结果,其中包含更新的行,新的行和已删除的行。