Hive与Impala对VARCHAR/CHAR存放中文字符解析不一致问题分析

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

Fayson的github:https://github.com/fayson/cdhproject

提示:代码块部分可以左右滑动查看噢

1.异常描述


首先我们在hive中创建一个表

1create external table test_table
2(
3s1 string,
4s2 CHAR(10),
5s3 VARCHAR(10)
6)
7row format delimited fields terminated by '#'
8stored as textfile location '/fayson/fayson_test_table';

(可左右滑动)

插入一行数据

1insert into test_table values ('1','我你我你我','我你我你我');

(可左右滑动)

使用Hive查询,一切正常

1select * from test_table;

(可左右滑动)

使用Impala查询

1select * from test_table;

(可左右滑动)

发现查询出来的字段被截断了。

我们看看插入数据生成的hdfs文件的编码:

1hadoop fs -get /fayson/fayson_test_table/000000_0_copy_1 .
2cat 000000_0_copy_1
3file -bi 000000_0_copy_1

(可左右滑动)

可以发现CHAR类型的字段10位,插入数据如果不够10位,Hive自动补了空格,另外生成的文件是utf-8编码。

2.异常解决


我们扩大CHAR/VARCHAR的长度定义,并引入一个String类型方便比较,再次在Hive中创建一张测试表进行测试。

1create external table test_table1
2(
3s1 string,
4s2 CHAR(15),
5s3 VARCHAR(15),
6s4 string
7)
8row format delimited fields terminated by '#'
9stored as textfile location '/fayson/fayson_test_table1';

(可左右滑动)

插入一条数据

1insert into test_table1 values ('1','我你我你我','我你我你我','我你我你我');

(可左右滑动)

使用Hive查询该表的数据,发现一切正常。

1select * from test_table1;

(可左右滑动)

使用Impala查询

1select * from test_table1;

(可左右滑动)

可以发现三个字段s2,s3,s4都没有被截断,查询结果正常。

3.异常总结


1.这是因为定义的CHAR(10)只能容纳3个半个中文字符导致的。Impala处理CHAR/VARCHAR类型的字段使用的是UTF-8编码, 内部使用字节数组。由于中文字符的UTF-8编码是3个字节。这意味CHAR(10)只能容纳最多3个完整的中文字符。

2.解决方案是使用CHAR(15), 这样最多可以容纳5个中文字符。不过如果您事先无法估计中文串长度, 则建议您使用STRING类型。

3.Hive和Impala在处理"字符"时是不一样的。Hive中的CHAR/VARCHAR字符串的长度是根据实际的代码页确定的。Hive的实现与Java保持一致。但Impala并没有采用这种做法。

4.来自Hive官网的原文,参考链接在文末。“Character length is determined by the number of code pointscontained by the character string.”即与Java字符串的.length()方法保持一致。

参考:

http://impala.apache.org/docs/build/html/topics/impala_varchar.html

https://issues.apache.org/jira/browse/IMPALA-5675

https://www.cloudera.com/documentation/enterprise/latest/topics/impala_varchar.html

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-VarcharvarcharVarchar

提示:代码块部分可以左右滑动查看噢

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

原文发布于微信公众号 - Hadoop实操(gh_c4c535955d0f)

原文发表时间:2018-04-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏后台架构

Sphinx源码学习笔记(一):索引创建

  因为项目开发需要在游戏内部实现玩家名称的模糊查找功能,本身直接使用Sphinx配置mysql可以直接搭建一套模糊匹配的即可支持功能的实现。

52070
来自专栏恰童鞋骚年

Hadoop学习笔记—9.Partitioner与自定义Partitioner

  在第四篇博文《初识MapReduce》中,我们认识了MapReduce的八大步凑,其中在Map阶段总共五个步骤,如下图所示:

7620
来自专栏数据库

使用VBA创建Access数据表

导读: 本期介绍如何在Access数据库中创建一张空数据表。下期将介绍如何将工作表中的数据存入数据库对应的表中,随后还将介绍如何从数据库的表中取出数据输出到Ex...

29170
来自专栏DOTNET

Entity Framework——性能测试

内容提要 一、对EF框架的性能测试 增、删、改,查测试及性能优化 二、使用sql执行 增、删、改,查测试 三、对以上两种方式对比分析 一 对EF框架的测试 1...

73360
来自专栏Kevin-ZhangCG

[ SSH框架 ] Hibernate框架学习之三

222110
来自专栏逸鹏说道

SQL Server 存储过程的几种常见写法分析

最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫, 不知道各种写法孰优孰劣,该选用那种写法,以及各种写法优缺点,本文以一...

43280
来自专栏Duncan's Blog

pyspark记录

1.1 spark.read.json() / spark.read.parquet() 或者 spark.read.load(path,format=”par...

30430
来自专栏企鹅号快讯

大数据入门基础系列之浅谈Hive的数据存储和元数据存储

Hive的数据存储 从表(Table)、外部表(External Table)、分区(Partition)和桶(Bucket)。 (1)Hive数据库 类似传统...

265100
来自专栏个人分享

SparkSQL(源码阅读三)

  额,没忍住,想完全了解sparksql,毕竟一直在用嘛,想一次性搞清楚它,所以今天再多看点好了~

49120
来自专栏扎心了老铁

使用spark与MySQL进行数据交互的方法

在项目中,遇到一个场景是,需要从Hive数据仓库中拉取数据,进行过滤、裁剪或者聚合之后生成中间结果导入MySQL。 对于这样一个极其普通的离线计算场景,有多种技...

1.3K90

扫码关注云+社区

领取腾讯云代金券