当前位置: 代码网 > it编程>数据库>大数据 > 关于Hive中的NULL空值处理问题

关于Hive中的NULL空值处理问题

2024年05月18日 大数据 我要评论
hive表中默认将null存为 ,可查看表的源文件(hadoop fs -cat或者hadoop fs -text),文件中存储大量 ,这样造成浪费大量空间。而且用java、python直接进入路

hive表中默认将null存为\n,可查看表的源文件(hadoop fs -cat或者hadoop fs -text),文件中存储大量\n,这样造成浪费大量空间。而且用java、python直接进入路径操作源数据时,解析也要注意。

另外,hive表的源文件中,默认列分隔符为\001(soh),行分隔符为\n(目前只支持\n,别的不能用,所以定义时不需要显示声明)。元素间分隔符\002,map中key和value的分隔符为\003。

举例,如源文件中一条记录为:

10000042soh77soh435soh16soh22soh1156120000soh\nsoh\nsoh\nsoh\nsoh\nsoh\nsoh\nsohyoukusoh85133.0soh111

可以看出存储null的\n 浪费了大量空间。

但hive的null有时候是必须的:

  • 1)hive中insert语句必须列数匹配,不支持不写入,没有值的列必须使用null占位。
  • 2)hive表的数据文件中按分隔符区分各个列。空列会保存null(\n)来保留列位置。但外部表加载某些数据时如果列不够,如表13列,文件数据只有2列,则在表查询时表中的末尾剩余列无数据对应,自动显示为null。

所以,null转化为空字符串,可以节省磁盘空间,实现方法有几种

1)建表时直接指定(两种方式)

a、用语句

row format serde ‘org.apache.hadoop.hive.serde2.lazy.lazysimpleserde'with serdeproperties('serialization.null.format' = '')

实现,注意两者必须一起使用,如

   create table hive_tb (id int,name string)
   partitioned by ( `day` string,`type` tinyint comment '0 as bid, 1 as win, 2 as ck', `hour` tinyint)
   row format serde ‘org.apache.hadoop.hive.serde2.lazy.lazysimpleserde'
   with serdeproperties (
        ‘field.delim'='/t',
        ‘escape.delim'='//',
        ‘serialization.null.format'=''
   ) stored as textfile;

b、或者通过row format delimited null defined as '' 如

   create table hive_tb (id int,name string)
   partitioned by ( `day` string,`type` tinyint comment '0 as bid, 1 as win, 2 as ck', `hour` tinyint)
   row format delimited 
        null defined as '' 
   stored as textfile;

2)修改已存在的表

    alter table hive_tb set serdeproperties('serialization.null.format' = '');

节省空间的验证结果如下:

    hadoop fs -du /hivedata/warehouse/pmp.db/hive_tb/day=2016-05-14/type=1/hour=00/0*
    1137
    hadoop fs -du /hivedata/warehouse/pmp.db/hive_tb/day=2016-05-14/type=1/hour=01/0*
    319753
    -----------------------------------
    hadoop fs -du /hivedata/warehouse/pmp.db/hive_tb/day=2016-05-14/type=1/hour=00/0*
    885
    hadoop fs -du /hivedata/warehouse/pmp.db/hive_tb/day=2016-05-14/type=1/hour=01/0*
    249529

到此这篇关于关于hive中的null空值处理问题的文章就介绍到这了,更多相关hive中的null内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • 数据库sql查询性能优化详解

    数据库sql查询性能优化详解

    前言对于一个只有几千行甚至几万行数据的查询的小系统来说,数据库的查询优化作用不大,但对于大型的应用系统,数据动辄上百万,就需要了解dbms对查询语句的处理过程和... [阅读全文]
  • DBeaver执行外部sql文件详细图文教程

    t1:dbeaver执行外部sql文件如果数据库已经存在了,那么直接右击库名,如下图:如果数据库不存在,外部sql文件中含有建库语句,可以先手动建库,再把sql文件中建库语句删了后…

    2024年05月18日 数据库
  • SQL查询的优化技巧详解

    前言查询优化的本质是让数据库优化器为sql语句选择最佳的执行计划。一般来说,对于在线交易处理(oltp)系统的数据库,减少数据库磁盘i/o是sql语句性能优化的首要方法,因为磁盘访…

    2024年05月18日 数据库
  • 把Navicat中数据库所有表导出的方法

    如何把navicat中的数据库中的所有表导出导入一个数据库的所有表第一步 打开navicat 找到你想要导出表的数据库第二步 右击该数据库,选择转储sql文件再选择结构和数据&he…

    2024年05月18日 数据库
  • 关于数据库性能优化中的表结构优化

    关于数据库性能优化中的表结构优化

    数据库性能优化中的表结构优化在数据库应用中,表结构的设计直接影响着数据库的性能。合理的表结构设计可以提高数据库的查询效率和性能,而不合理的表结构设计则可能导致查... [阅读全文]
  • mysql与MongoDB性能对比,哪个更适合自己

    mysql与mongodb都是开源的常用数据库,但是mysql是传统的关系型数据库,mongodb则是非关系型数据库,也叫文档型数据库,是一种nosql的数据库。它们各有各的优点,…

    2024年05月18日 数据库

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com