Apache spark 在Spark中写入唯一值,同时保留旧值

Apache spark 在Spark中写入唯一值,同时保留旧值,apache-spark,dataframe,apache-spark-sql,Apache Spark,Dataframe,Apache Spark Sql,我有一个火花工作,这是计划执行的时间 当我将结果数据帧写入数据目标S3、HDFS、DB…,我希望Spark写入的内容不会对特定列重复 例如: 假设MY_ID是唯一的列 第一次执行: -------------- |MY_ID|MY_VAL| -------------- | 1 | 5 | | 2 | 9 | | 3 | 6 | -------------- -------------- |MY_ID|MY_VAL| -------------- | 2 |

我有一个火花工作,这是计划执行的时间

当我将结果数据帧写入数据目标S3、HDFS、DB…,我希望Spark写入的内容不会对特定列重复

例如:

假设MY_ID是唯一的列

第一次执行:

--------------
|MY_ID|MY_VAL|
--------------
|  1  |   5  |
|  2  |   9  |
|  3  |   6  |
--------------
--------------
|MY_ID|MY_VAL|
--------------
|  2  |   9  |
|  3  |   2  |
|  4  |   4  |
--------------
第二次执行:

--------------
|MY_ID|MY_VAL|
--------------
|  1  |   5  |
|  2  |   9  |
|  3  |   6  |
--------------
--------------
|MY_ID|MY_VAL|
--------------
|  2  |   9  |
|  3  |   2  |
|  4  |   4  |
--------------
在2次执行之后,我希望在数据目标中找到如下内容:

--------------
|MY_ID|MY_VAL|
--------------
|  1  |   5  |
|  2  |   9  |
|  3  |   6  |
|  4  |   4  |
--------------
其中,预期输出是第一次执行的结果,并附加第二次执行的结果。如果MY_ID的值已经存在,则保留旧值,丢弃新执行的结果。在这种情况下,第二次执行希望为MY_ID 3写入MY_VAL 9。由于此记录从第一次执行时就已存在,因此将丢弃新记录

因此,独特的功能不足以保证这一条件。即使在转储的输出中,也应保持列MY_ID的唯一性


是否有任何解决方案可以以合理的计算成本保证该属性?这与关系数据库中的UNIQUE基本相同。

不确定您使用的是Scala还是Python,但请查看dropDuplicates函数,该函数允许您指定一个或多个列:

您可以在第一次和第二次迭代时执行fullOuterJoin

val joined = firstIteration.join(secondIteration, Seq("MY_ID"), "fullouter")

scala> joined.show
+-----+------+------+
|MY_ID|MY_VAL|MY_VAL|
+-----+------+------+
|    1|     5|  null|
|    3|     6|     2|
|    4|  null|     4|
|    2|     9|     9|
+-----+------+------+
从结果表中,如果firstIteration的MY_VAL有值,则可以按原样使用它。如果为null,则表示该键仅在第二次迭代中出现。使用secondIteration的MY_VAL中的值


这个解决方案的问题是,第一次迭代需要类似于spark.read.[source]参数。这意味着为读取持久化源引入了开销。Plus的可扩展性不是很好,因为我希望所描述的步骤可以像更新关系数据库一样反复执行。我一直在寻找一个开箱即用的解决方案,比如关系数据库中的独特列,它已经实现并经过高度优化。不是一种获得相同结果但计算成本更高的变通方法