sqoop
同步数据的时候考虑:
数据量大小、增长量、是否要初始化、是否要补历史数据
数据是否会存在变化
数据同步方式,日?月?增量?全量?
全量导入:数据量在600w以下的全量导入
增量导入:
(1) 数据量大,不涉及更新数据历史变化,就按照etl日期,每天保存一个分区
(2) 数据量大,涉及更新数据历史变化,按照数据更新日期 = etl日期,每天保存一个分区,存到zz_表名的表中,然后从增量表中按照主键分组date_upated日期排序,取updated最新的一条插入到目标表中
比如:交易对账、结算明细表:有支付金额,交易金额,后续涉及金额修改,更新了数据
账单库(理赔):账单金额,涉及到一些金额变化的表的数据
默认是4个map数
遇到的问题:
Hive中的Null在底层是以“\N”来存储,而MySQL中的Null在底层就是Null,为了保证数据两端的一致性。
在导出数据时采用–input-null-string和–input-null-non-string两个参数。
导入数据时采用–null-string和–null-non-string。
sqoop导出数据一致性问题 --staging-table
当Sqoop导出数据到MySql时,使用4个map怎么保证数据的一致性
因为在导出数据的过程中map任务可能会失败,可以使用—staging-table –clear-staging
任务执行成功首先在tmp临时表中,然后将tmp表中的数据复制到目标表中(这个时候可以使用事务,保证事务的一致性)
sqoop导数到hive的时候,hive表要建成textfile格式
原因:sqoop不能解析ORC/parquet格式的⽂件???
query自由查询导入时,sql语句中必须带 $CONDITIONS条件 : where $CONDITIONS ,要
么 where id>20 and
C
O
N
D
I
T
I
O
N
S
原因:因为
s
q
o
o
p
要将你的
s
q
l
语句交给多个不同的
m
a
p
t
a
s
k
执行,每个
m
a
p
t
a
s
k
执行
s
q
l
时肯定要按任务规划加范围条件,所以就提供了这个
CONDITIONS 原因:因为sqoop要将你的sql语句交给多个不同的maptask执行,每个maptask执行sql时肯定要按任务规划加范围条件,所以就提供了这个
CONDITIONS原因:因为sqoop要将你的sql语句交给多个不同的maptask执行,每个maptask执行sql时肯定要按任务规划加范围条件,所以就提供了这个CONDITIONS作为将来拼接条件的占位符
公司大数据平台ETL操作中,在使用sqoop将mysql中的数据抽取到hive中时,由于mysql库中默写字段中会有换行符,导致数据存入hive后,条数增多(每个换行符会多出带有null值得一条数据),导致统计数据不准确。
利用一下两个参数可以实现对换行等特殊字符的替换或者删除
–hive-delims-replacement
–hive-drop-import-delims
在原有sqoop语句中添加 --hive-delims-replacement “ ” 可以将如mysql中取到的\n, \r, and \01等特殊字符替换为自定义的字符,此处用了空格
在原有sqoop语句中添加 --hive-drop-import-delims 可以将如mysql中取到的\n, \r, and \01等特殊字符丢弃
补历史数据的时候要从前面日期往后面日期补,否则会有老数据覆盖新数据的情况