背景
在工作中需要同步pg数据库下的某张表到hive,使用的工具是开源的sqoop,业务表的数据表包含最近一年的数据,数据表的行数为366,830,898,数据表的字段个数为71个,数据表在pg中的空间大小为110G;pg中表没有唯一主键,同一个id的数据可能会出现多次,且都是业务允许的正常场景。
分析
全量同步数据
每次将pg的整表全量同步到hive分区表中,这种做法同步的速度很慢,这张表后面会有依赖,会影响后续数据的产出,且会有数据表block的风险,所以不适合用全量的方式同步
增量同步数据
查看每天有改动的数据的记录数,最多为200万,数据的体积约为700M。尝试单独用sqoop同步一天的数据速度很快,sqoop同步的时候要指定map划分的split字段,所以在pg中先在查询和分割字段上加上索引。增量的数据要和前一天的全量分区做合并,因为同一个id不管在增量的表中还是全量的表中都会出现多行记录,所以并不能使用A left join B where b.id is not null的方式去处理,也不能left semi join 去处理。
尝试
not in 方式
查询在hive原始表中同时不在增量表中的id对应的数据,接着和增量的最新数据做union all。
hive -e "
insert overwrite table target_table partition(dt = '$curr_date')
select
a.*
from a
where
a.dt = '$