• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: 山止川行 | 发布时间: 2025-6-20 09:11| 查看数: 108| 评论数: 0|帖子模式

    HIVE表中默认将NULL存为\N,可查看表的源文件(hadoop fs -cat或者hadoop fs -text),文件中存储大量\N,这样造成浪费大量空间。而且用java、python直接进入路径操作源数据时,解析也要注意。
    另外,hive表的源文件中,默认列分隔符为\001(SOH),行分隔符为\n(目前只支持\n,别的不能用,所以定义时不需要显示声明)。元素间分隔符\002,map中key和value的分隔符为\003。
    举例,如源文件中一条记录为:
    1. 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、用语句
    1. ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'with serdeproperties('serialization.null.format' = '')
    复制代码
    实现,注意两者必须一起使用,如
    1.    CREATE TABLE hive_tb (id int,name STRING)
    2.    PARTITIONED BY ( `day` string,`type` tinyint COMMENT '0 as bid, 1 as win, 2 as ck', `hour` tinyint)
    3.    ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
    4.    WITH SERDEPROPERTIES (
    5.         ‘field.delim'='/t',
    6.         ‘escape.delim'='//',
    7.         ‘serialization.null.format'=''
    8.    ) STORED AS TEXTFILE;
    复制代码
    b、或者通过ROW FORMAT DELIMITED NULL DEFINED AS '' 如
    1.    CREATE TABLE hive_tb (id int,name STRING)
    2.    PARTITIONED BY ( `day` string,`type` tinyint COMMENT '0 as bid, 1 as win, 2 as ck', `hour` tinyint)
    3.    ROW FORMAT DELIMITED 
    4.         NULL DEFINED AS '' 
    5.    STORED AS TEXTFILE;
    复制代码
    2)修改已存在的表
    1.     alter table hive_tb set serdeproperties('serialization.null.format' = '');
    复制代码
    节省空间的验证结果如下:
    1.     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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/database/291437eho.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    浏览过的版块

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表