Sqoop增量导入与数据去重

sqoop是可以配置job自动运行的,能自动记录上次同步的时间,不过如果任务失败就不方便重跑了(这方面经验不足)。

目前的做法是手动去配置一个固定的同步周期和–last-modify值,这样一来就可能有数据重复的问题(比如数据漂移、或者任务失败重跑需要一个保险的覆盖范围)。

解决思路大致是在同步时先允许数据重复,之后再跑一个去重sql,比如:
sqoop增量导入问题
不过这样做太不优雅,因为这样操作会多出一张没有实际意义的增量表。

这里增量导入的做法差不多,只是增量到同一张表里,注意需要添加–hive-database以及–hive-table选项让新数据能自动load到hive表里,标准解释如下:
Difference between –append and –incremental append in sqoop
之后使用窗口函数sql去重处理

INSERT OVERWRITE TABLE db_name.tb_name
select
tmp.id,
tmp.modify_time
from
(
select t.*,
row_number() over(partition by t.id order by t.modify_time desc) as rn
 from
(select
id,modify_time from db_name.tb_name
) t
) tmp where tmp.rn=1;

当然这样要求原表有主键以及准确非空的修改时间,如果没有还是用真正的流式数据同步来做吧(maxwell解析binlog->kafka->flume->hive)

Done.

附一个比较全的教程Sqoop Incremental Import | MySQL to Hive

    原文作者:gregocean
    原文地址: https://www.jianshu.com/p/e6e3ca84ea5f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞