之前介绍了从oracle,mysql,pg等数据库增量同步数据到hive中,并且能使关系型数据库中的数据修改之后,hive也能与之一致。
但是之前的方案,只能解决源数据端的数据修改同步一致性的问题,而不能解决源数据端删除数据一致性问题。
下面给出一个解决方案以供参考:
如下图所示oracle和hive中正常情况下数据同步应该保持一致:
但是oracle源端数据库进行了数据删除,删除了zhangsan这一条数据,导致使oracle中的数据比hive中的数据少:
如果要保持hive和oracle中数据一致,该怎么做呢?(该表的字段特别多比如有200个字段,数据量也特别大,所以重新全量同步不行)
我们可以只同步oracle源表的主键字段到hive中的一个临时表中(只同步主键字段时间很快,实测oracle一个表有300G数据,只同步主键,大概耗时2小时),将hive中的表和这个临时表做inner join,然后将结果overwrite 到最终的这个hive表中即可实现。
如下图:
insert overwrite table lijie_table
select
a.id,a.name.a.addr
from
lijie_table a
inner join
lijie_table_tmp b
on
a.id = b.id