美文网首页Hadoop
120.VARCHAR/CHAR存放问题分析

120.VARCHAR/CHAR存放问题分析

作者: 大勇任卷舒 | 来源:发表于2022-09-07 18:14 被阅读0次

    异常情况

    • 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开发运维
    企业级大数据技术应用
    大数据机器学习案例之推荐系统
    自然语言处理
    大数据基础
    人工智能:深度学习入门到精通

    相关文章

      网友评论

        本文标题:120.VARCHAR/CHAR存放问题分析

        本文链接:https://www.haomeiwen.com/subject/jvponrtx.html