问题描述

我们通常在迁移数据到大数据环境中,会使用,sqoop、datax之类的etl工具,从数据库中迁移到hive或hdfs。数据库中的原始数据中的文本类数据难免会有特殊字符,比如换行符,会对导入Hive后的数据产生影响。下面是从mysql导入hive的数据,其中,hive表是textfile格式存储特殊字符没做处理:
在这里插入图片描述

发现有两个字段没了,于是再看看hive表在hdfs上的文件:
在这里插入图片描述
发现原本一行的数据,变成多行了,文本中有‘\n’换行符,导致位置错乱,所以hive查出来有两个字段没了

解决方法一

把换行符替换成空字符串,sqoop中有替换的参数,但是datax中没有。有些场景中,为了保留数据的完整性,必须保留换行符怎么办呢?

解决方法二

用orc存储hive表
ORC的全称是(Optimized Row Columnar),ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache Hive,用于降低Hadoop数据存储空间和加速Hive查询速度。和Parquet类似,它并不是一个单纯的列式存储格式,仍然是首先根据行组分割整个表,在每一个行组内进行按列存储。ORC文件是自描述的,它的元数据使用Protocol Buffers序列化,并且文件中的数据尽可能的压缩以降低存储空间的消耗,目前也被Spark SQL、Presto等查询引擎支持
因为是列式存储,所以不存在某字段的换行符的原因导致数据错乱

用orc存储后的表,全表查询:
在这里插入图片描述
咦?怎么还是空的?下面几行怎么全是null?列式存储不应该出现这种情况啊!
别急, 你看到的不一定是真实的
增加过滤条件指定这行的id试试
在这里插入图片描述
咦?怎么又有了?
解释:我用的是ambari自带的hive查询界面,这可能是ambari本身显示的bug,它把文本数据里面的换行符也展示出来了,所以页面上看到还是乱的,but,实际数据并没有乱,你执行任何查询都不会有问题,页面展示的问题,不再是数据的问题!!

Logo

更多推荐