1.sqoop全量导入
mysql import到hive中表的当天分区中,每日都是全量数据.
-m 用来指定maptask的并行度
2.sqoop增量导入
怎么区分哪些是增量数据?
根据id字段来区分什么是增量.
场景:数据不发生变化并且id是递增的
比如昨天导入的id 为1 和 2 的数据,
今天我就可以指定导入where id>2的数据.
--incremental append 业务库的数据是不断增加的并且不会修改
--check-column id 根据id列去看他是新增数据
--last-value 2 上次导到id为2的数据,这次从2以后开始导
代码示例:
## --增量导入 1 --根据一个递增字段来界定增量数据
sqoop import \
--connect jdbc:mysql://wxt01:3306/ry \
--username root \
--password 123456 \
--table jw_stu_zsgl \
--hive-import \
--hive-table test.jw_stu_zsgl \
--split-by id \
--incremental append \
--check-column id \
--last-value 40 \
-m 2
根据updatetime字段来区分什么是增量.
一般我们业务表中的数据都是会发生变化的.所以根据id来确认是否增量数据就不行了.
所以我们根据 lastmoddified 最后修改时间 去判断是否 增量数据.
--incremental lastmoddified 根据最后修改时间来确定增量
--check-column updatetime 表中记录最后修改时间的字段名
--last-value '2021-03-01 23:59:59' 上次导入的时间值.这次从大于value值的数据开始导
代码示例:
## --增量导入 2 --根据修改时间来界定增量数据, 要求必须有一个时间字段,且该字段会跟随数据的修改而修改
## lastmodified 模式下的增量导入,不支持hive导入
sqoop import \
--connect jdbc:mysql://wxt01:3306/ry \
--username root \
--password 123456 \
--table jw_stu_zsgl \
--target-dir '/sqoopdata/jw_stu_zsgl' \
--incremental lastmodified \
--check-column stu_updatetime \
--last-value '2021-03-01 23:59:59' \
--fields-terminated-by ',' \
--merge-key id \
-m 1 \
--append # 追加而不是覆盖
合并-sqoop自带合并功能
--merge-key id
很少用,每天只保留最新的一份全量数据,看不到历史增量,也就是历史状态数据.
一般合并
将每天抽取的增量数据进行保存,然后跟前一天的全量数据(相对于业务库数据的全量状态)进行合并得到一份全量,
合并后的全量数据每天保留一份在当天分区.
好处可以保留每天的增量数据.
增量导入就是导入业务库表中当天发生变化的数据和新增的数据到hive
hive表中每天保留的是业务库表中当天的全量数据.
所以当天的增量数据还要和昨天的全量数据进行合并union all,并且比如说是订单表的话,
因为订单id相同的只保留今天的.
今天的增量数据A union all 昨天全量表B中今天增量数据中没有出现的orderid的数据.
代码:
select --昨天全量中今天增量中orderid没有的数据
B.orderid,
B.orderstatus,
B.createtime
B.updatetime
from
B left join A
on B.orderid=A.orderid
where B.dt='2020-03-08'
and A.orderid is null
union all --就是业务库表中当天的全量数据
select --今天的增量
orderid,
orderstatus,
createtime,
updatetime
from A
;