热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Sqoop同步数据数据中存在换行符导致两边数据条数不一致问题解决(AVRO格式应用)

目录0引言1现象2问题解决03小结0引言“本文讲解了Sqoop同步数据中存在特殊换行符导致两边数据不一致问题的解决方法,同时对AVRO对解决这一类问题进行了

目录

0 引言

1 现象

2 问题解决

03 小结



0 引言

本文讲解了Sqoop同步数据中存在特殊换行符导致两边数据不一致问题的解决方法,同时对AVRO对解决这一类问题进行了重点讲解,包括AVRO语法格式、Hive建表语法等。

  • 本文主要知识点:AVRO存储格式及建表语法

1 现象

问题:Sqoop采集完成后导致HDFS数据与Oracle数据量不符。

原因

  • sqoop以文本格式导入数据时,默认的换行符是特殊字符

  • Oracle中的数据列中如果出现了\n、\r、\t等特殊字符,就会被划分为多行

  • Oracle数据


idnameage
001zhang\nsan18

  • Sqoop遇到特殊字段就作为一行

  • 001 zhangsan 18

  • Hive

id name age001 zhang san 18

结论:当sqoop同步数据时,数据中存在换行符如(\n),sqoop会根据换行符自动将数据换行,导致最终在hive中同步看到的数据结果与原始数据不一致。


2 问题解决
  • 方案一:删除或者替换数据中的换行符

    • --hive-drop-import-delims:删除换行符

    • --hive-delims-replacement  char:替换换行符

    • 不建议使用:侵入了原始数据

  • 方案二:使用特殊文件格式:AVRO格式

问题解决:Avro格式

常见格式介绍

类型介绍
TextFileHive默认的文件格式,最简单的数据格式,便于查看和编辑,耗费存储空间,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

  • 优点

    • 二进制数据存储,性能好、效率高

    • 使用JSON描述模式,支持场景更丰富

    • Schema和数据统一存储,消息自描述

    • 模式定义允许定义数据的排序

  • 缺点

    • 只支持Avro自己的序列化格式

    • 少量列的读取性能比较差,压缩比较低

  • 场景:基于行的大规模结构化数据写入、列的读取非常多或者Schema变更操作比较频繁的场景

  • Sqoop使用Avro格式


  • 使用测试

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

  • 方式一:手动定义Schema

CREATE TABLE embeddedCOMMENT "这是表的注释"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"}] }');

  •  方式二:加载Schema文件

    需要先将表的schema信息放到HDFS上(先得同步schema,注意数据类型需要和hive对应)

```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_areascomment '行政地理区域表'PARTITIONED BY (dt string)stored as avrolocation '/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呀",关注我不迷路

 

 


推荐阅读
author-avatar
手机用户2502863701
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有