目录
0 引言
1 现象
2 问题解决
03 小结
0 引言
“ 本文讲解了Sqoop同步数据中存在特殊换行符导致两边数据不一致问题的解决方法,同时对AVRO对解决这一类问题进行了重点讲解,包括AVRO语法格式、Hive建表语法等。”
1 现象
问题:Sqoop采集完成后导致HDFS数据与Oracle数据量不符。
原因
-
Sqoop遇到特殊字段就作为一行
-
001 zhang
san 18
-
Hive
id name age
001 zhang
san 18
结论:当sqoop同步数据时,数据中存在换行符如(\n),sqoop会根据换行符自动将数据换行,导致最终在hive中同步看到的数据结果与原始数据不一致。
2 问题解决
问题解决:Avro格式
常见格式介绍
类型 | 介绍 |
---|
TextFile | Hive默认的文件格式,最简单的数据格式,便于查看和编辑,耗费存储空间,I/O性能较低 |
SequenceFile | 含有键值对的二进制文件,优化磁盘利用率和I/O,并行操作数据,查询效率高,但存储空间消耗最大 |
AvroFile | 特殊的二进制文件,设计的主要目标是为了满足schema evolution,Schema和数据保存在一起 |
OrcFile | 列式存储,Schema存储在footer中,不支持schema evolution,高度压缩比并包含索引,查询速度非常快 |
ParquetFile | 列式存储,与Orc类似,压缩比不如Orc,但是查询性能接近,支持的工具更多,通用性更强 |
Avro格式特点
选项
--as-avrodatafile Imports data to Avro datafiles
注意:如果使用了MR的Uber模式,必须在程序中加上以下参数避免类冲突问题
-Dmapreduce.job.user.classpath.first=true
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
Hive中建表
create external table test_avro(
line string
)
stored as avro
location '/test/full_imp/ciss4.ciss_service_workorder';
统计行数
select count(*) from test_avro;
Avro建表语法
-
Hive官网:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTable
-
DataBrics官网:https://docs.databricks.com/spark/2.x/spark-sql/language-manual/create-table.html
-
Avro用法:https://cwiki.apache.org/confluence/display/Hive/AvroSerDe
指定文件类型
stored as avro
```sql
--解析表的文件的时候,用哪个类来解析
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
--读取这张表的数据用哪个类来读取
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
--写入这张表的数据用哪个类来写入
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat ```
指定Schema
CREATE TABLE embedded
COMMENT "这是表的注释"
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
TBLPROPERTIES (
'avro.schema.literal'='{
"namespace": "com.howdy",
"name": "some_schema",
"type": "record",
"fields": [ { "name":"string1","type":"string"}]
}'
);
```sql
CREATE TABLE embedded
COMMENT "这是表的注释"
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED as INPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
TBLPROPERTIES (
'avro.schema.url'='file:///path/to/the/schema/embedded.avsc'
);
```
建表语法
方式一:指定类型和加载Schema文件
create external table one_make_ods_test.ciss_base_areas
comment '行政地理区域表'
PARTITIONED BY (dt string)
stored as avro
location '/data/dw/ods/one_make/full_imp/ciss4.ciss_base_areas'
TBLPROPERTIES ('avro.schema.url'='/data/dw/ods/one_make/avsc/CISS4_CISS_BASE_AREAS.avsc');
- 方式二:指定解析类和加载Schema文件
```sqlcreate external table one_make_ods_test.ciss_base_areascomment '行政地理区域表'PARTITIONED BY (dt string)ROW FORMAT SERDE'org.apache.hadoop.hive.serde2.avro.AvroSerDe'STORED AS INPUTFORMAT'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'OUTPUTFORMAT'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'location '/data/dw/ods/one_make/full_imp/ciss4.ciss_base_areas'TBLPROPERTIES ('avro.schema.url'='/data/dw/ods/one_make/avsc/CISS4_CISS_BASE_AREAS.avs
``````create external table 数据库名称.表名comment '表的注释'partitioned byROW FORMAT SERDE'org.apache.hadoop.hive.serde2.avro.AvroSerDe'STORED AS INPUTFORMAT'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'OUTPUTFORMAT'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'location '这张表在HDFS上的路径' TBLPROPERTIES ('这张表的Schema文件在HDFS上的路径');
```
03 小结
本文讲解了Sqoop同步数据中存在特殊换行符导致两边数据不一致问题的解决方法,同时对AVRO对解决这一类问题进行了重点讲解,包括AVRO语法格式、Hive建表语法等。
欢迎关注石榴姐公众号"我的SQL呀",关注我不迷路