120.VARCHAR/CHAR存放问题分析

异常情况

  • hive中创建一个表
create external table test_table
(
s1 string,
s2 CHAR(10),
s3 VARCHAR(10)
)
row format delimited fields terminated by '#'
stored as textfile location '/fayson/fayson_test_table';
  • 插入中文字符
insert into test_table values ('1','我你我你我','我你我你我');
  • Hive使用正常
select * from test_table;
  • Impala查询
select * from test_table;
  • 数据生成的hdfs文件的编码
hadoop fs -get /fayson/fayson_test_table/000000_0_copy_1 .
cat 000000_0_copy_1
file -bi 000000_0_copy_1

解决方法

  • 扩大CHAR/VARCHAR的长度定义
create external table test_table1
(
s1 string,
s2 CHAR(15),
s3 VARCHAR(15),
s4 string
)
row format delimited fields terminated by '#'
stored as textfile location '/fayson/fayson_test_table1';

插入数据

insert into test_table1 values ('1','我你我你我','我你我你我','我你我你我');
  • Hive查询正常
select * from test_table1;
  • Impala查询正常
select * from test_table1;


总结

  • Hive和Impala在处理字符时是不一样的
    • Hive的实现与Java保持一致,但Impala并没有
    • Hive中的CHAR/VARCHAR字符串的长度是根据实际的代码页确定的
  • Impala处理CHAR/VARCHAR类型的字段使用的是UTF-8编码, 内部使用字节数组
    • 中文字符的UTF-8编码是3个字节,CHAR(10)只能容纳最多3个完整的中文字符
    • 定义的CHAR(10)只能容纳3个半个中文字符导致的问题
    • 解决方法是使用CHAR(15), 这样最多可以容纳5个中文字符,如事先无法估计中文串长度, 则建议使用STRING类型

大数据视频推荐:
腾讯课堂
CSDN
人工智能算法竞赛实战
AIops智能运维机器学习算法实战
ELK7 stack开发运维实战
PySpark机器学习从入门到精通
AIOps智能运维实战
大数据语音推荐:
ELK7 stack开发运维
企业级大数据技术应用
大数据机器学习案例之推荐系统
自然语言处理
大数据基础
人工智能:深度学习入门到精通

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容