Sqoop--增量导入

数据采集方式

  • 全量:导入所有数据
  • 增量:只导入最新的数据【新产生的数据和发生变化的数据】
  • 举例
  • 2020-01-01:今天Mysql产生的数据
1 laoda 20
2 laoer 30
3 laosan 40
  • 2020-01-02:对昨天产生的数据进行采集分析
  • HDFS采集的数据
1   laoda   20
2   laoer   30
3   laosan  40
  • Mysql中的数据
1   laoba   20
2   laoer   30
3   laosan  40
4   laosi   50
5   laowu   60
  • 2020-01-03:对昨天产生的数据进行采集分析

  • HDFS采集的数据

1   laoba   20
2   laoer   30
3   laosan  40
4   laosi   50
5   laowu   60
  • 之前已经采集过的数据,不需要再次采集,只采集最新的数据
  • 例如订单业务
  • 2020-01-01
    • 2020-01-01 laoda 成功订单
  • 2020-01-02:采集1号的订单分析前一天的订单数据
    • 总共成交订单
    • 订单总金额
    • 这一天也产生许多的订单并且1号的订单有变化
      • 2020-01-02 laoda 退款订单
  • 2020-01-03:采集2号的订单分析前一天的数据
    • 只需要采集2号的新的订单,1号的订单不用再采集了
    • 如果有之前的订单发生了变化,也需要进行采集

Sqoop中增量的实现

Incremental import arguments:
   --check-column <column>        Source column to check for incremental
                                  change
   --incremental <import-type>    Define an incremental import of type
                                  'append' or 'lastmodified'
   --last-value <value>           Last imported value in the incremental
                                  check column
  • –incremental:指定增量导入的方式
    • append:追加导入,只导入增加的数据
    • lastmodified:根据时间戳来进行导入,增加了 新的数据或者数据被更新都会被导入
  • –check-column:按照哪一列进行增量导入
  • –last-value:指定这一列上一次的值是什么

Append:追加增量

  • 特点:根据某一列int值做判断,每次只导入大于上一次的值的数据
  • 要求:指定的列必须为int类型的标识列,自动增长的主键
  • 第一次导入:全量导入
bin/sqoop import \
--connect jdbc:mysql://node-03:3306/sqoop \
--username root \
--password 123456 \
--table tb_tohdfs \
--delete-target-dir \
--target-dir /sqoop/import/test02 \
--fields-terminated-by '\t' \
-m 1
  • 第二天:产生了新的数据

  • 在Mysql中执行

insert into tb_tohdfs values(null,"laowu",22);
insert into tb_tohdfs values(null,"laoliu",23);
insert into tb_tohdfs values(null,"laoqi",24);
insert into tb_tohdfs values(null,"laoba",25);
  • 第二次导入:增量导入,以id作为增量判断的列
bin/sqoop import \
--connect jdbc:mysql://node-03:3306/sqoop \
--username root \
--password 123456 \
--table tb_tohdfs \
--target-dir /sqoop/import/test02 \
--fields-terminated-by '\t' \
--incremental append \
--check-column id \
--last-value 4 \
-m 1

lastmodified:按照时间戳进行导入

  • 特点:只要数据发生变化,就会被导入,既导入新增加的数据又导入发生改变的数据
  • 要求:必须要有数据变化时间这一列
  • 测试
  • Mysql创建测试数据
CREATE TABLE `tb_lastmode` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `word` varchar(200) NOT NULL,
  `lastmode` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into tb_lastmode values(null,'hadoop',null);
insert into tb_lastmode values(null,'spark',null);
insert into tb_lastmode values(null,'hbase',null);
  • 第一次导入HDFS
bin/sqoop import \
--connect jdbc:mysql://node-03:3306/sqoop \
--username root \
--password 123456 \
--table tb_lastmode \
--target-dir /sqoop/import/test03 \
--fields-terminated-by '\t' \
--incremental lastmodified \
--check-column lastmode \
--last-value '2020-01-01 00:00:00' \
-m 1
  • 第二天:数据发生了变化
insert into tb_lastmode values(null,'hive',null);
update tb_lastmode set word = 'sqoop' where id = 1;
  • 第二次采集
bin/sqoop import \
--connect jdbc:mysql://node-03:3306/sqoop \
--username root \
--password 123456 \
--table tb_lastmode \
--target-dir /sqoop/import/test03 \
--fields-terminated-by '\t' \
--merge-key id \
--incremental lastmodified \
--check-column lastmode \
--last-value '2020-06-11 13:35:46' \
-m 1
  • 会启动两个MapReduce

    • 第一个MapReduce按照时间将最新的数据进行采集
    • 第二个MapReduce实现按照id进行合并,用新的值代替老的值

总结

为什么要做增量?

  • 只有第一次是所有数据全部采集
  • 后面的每一次都只采集最新的数据

方式一:append

  • 实现:根据某一列int类型的值,来判断,大于上一次的值就会被采集,这个值必须为递增的
  • 特点:只能采集增加的数据
  • 要求:必须有一列增加的Int列

方式二:lastmodified

  • 实现:根据数据修改的时间戳来采集数据,只要大于上一次的采集时间,就会被采集
  • 特点:既能采集增加的数据又能采集更新的数据
  • 要求:必须要有时间这一列
  • 这个在工作中反而用的不多
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值