背景
使用Sqoop采集完成后导致HDFS数据与Oracle数据量不符
原因分析
- sqoop以文本格式TextFile导入数据时,默认的换行符是特殊字符
- Oracle中的数据列中如果出现了\n、\r、\t等特殊字符,就会被划分为多行
举例
Oracle
id name age
1 lao da 20
2 lao\ner 22
hdfs
1 lao da 20
2 lao
er 22
解决方案
方案一 删除或者替换数据中的换行符【数据被侵入】
- hive-drop-import-delims:删除换行符
- hive-delims-replacement char:替换换行符
注 此种方法慎用,会修改掉数据内容,改变数据
方案二 不使用textfile 格式进行存储 使用orc /Avro格式进行存储
orc格式的压缩比是最高的
单我们采用Avro 格式
Avro 格式 简介
Avro 格式 类似于表格文件,不光可以解决sqoop导入的问题,也可以帮助我们更方便实现自动化建表.
因为avro 格式进行存储的时候,会在本地存储一份 表数据的Schema信息 包括 表的字段,数据类型等,我们可以通过这个schema信息 实现自动化建表
优点
-
二进制数据存储,性能好、效率高
-
使用JSON描述模式,支持场景更丰富
-
Schema和数据统一存储,消息自描述:把Avro格式的文件当做表来看
-
模式定义允许定义数据的排序
-
缺点
-
只支持Avro自己的序列化格式
-
少量列的读取性能比较差,压缩比较低
适用场景:基于行的大规模结构化数据写入、列的读取非常多或者Schema变更操作比较频繁的场景
-
测试
--as-avrodatafile Imports data to Avro datafiles
sqoop import \
-Dmapreduce.job.user.classpath.first=true \
--connect jdbc:oracle:thin:@oracle.bigdata.cn:1521:helowin \
--username ciss \
--password 123456 \
--table CISS4.CISS_SERVICE_WORKORDER \
--delete-target-dir \
--target-dir /test/full_imp/ciss4.ciss_service_workorder \
--as-avrodatafile \
--fields-terminated-by "\001" \
-m 1
网友评论