hive有varchar类型么(CHAR存放中文字符解析不一致分析)
hive有varchar类型么(CHAR存放中文字符解析不一致分析)使用Hive查询,一切正常1insert into test_table values ('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'; (可左右滑动)插入一行数据
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。
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实操