• Hive默认分隔符和默认NULL值


    HIve系统默认分隔符。通常下面2中情况我们需要需要用到分隔符

    1,制作table的输入文件,有时候我们需要输入一些特殊的分隔符

    2,把hive表格导出到本地时,系统默认的分隔符是^A,这个是特殊字符,直接cat或者vim是看不到的

    分隔符在HIVE中的用途

    分隔符

    描述

    对于文本文件来说,每行都是一条记录,因此换行符可以分隔记录

    ^A(Ctrl+A)

    用于分隔字段(列)。在CREATE TABLE语句中可以使用八进制编码01表示

    ^B(Ctrl+B)

    用于分隔ARRAY或者STRUCT中的元素,或用于MAP中键-值对之间的分隔。在CREATE TABLE语句中可以使用八进制编码02表示

    ^C(Ctrl+C)

    用于MAP中键和值之间的分隔。在CREATE TABLE语句中可以使用八进制编码03表示

    Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、”	”、”x001″)、行分隔符(”
    ”)以及读取文件数据的方法。
    由于在加载数据的过程中,不需要从用户数据格式到 Hive 定义的数据格式的转换,因此,Hive 在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的 HDFS 目录中。

    sql:

    row format delimited 
    fields terminated by '01' 
    collection items terminated by '02' 
    map keys terminated by '03'
    lines terminated by '
    ' 
    stored as textfile; 

    HIVE表中默认将NULL存为N,可查看表的源文件(hadoop fs -cat或者hadoop fs -text),文件中存储大量N。

    这样造成浪费大量空间。而且用java、python直接进入路径操作源数据时,解析也要注意。
    另外,hive表的源文件中,默认列分隔符为01(SOH),行分隔符为 (目前只支持 ,别的不能用,所以定义时不需要显示声明)。元素间分隔符02,map中key和value的分隔符为03。

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

    可以看出存储NULL的N 浪费了大量空间。

    但hive的NULL有时候是必须的:
    1)hive中insert语句必须列数匹配,不支持不写入,没有值的列必须使用null占位。

    2)hive表的数据文件中按分隔符区分各个列。空列会保存NULL(N)来保留列位置。但外部表加载某些数据时如果列不够,如表13列,文件数据只有2列,则在表查询时表中的末尾剩余列无数据对应,自动显示为NULL。

    可以看出存储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
    大多数人都以为是才智成就了科学家,他们错了,是品格。---爱因斯坦
  • 相关阅读:
    指向函数的指针 分类: C/C++ 2015-07-13 11:03 14人阅读 评论(0) 收藏
    Nginx平台构架 分类: Nginx 2015-07-13 10:55 205人阅读 评论(0) 收藏
    Nginx介绍 分类: Nginx 服务器搭建 2015-07-13 10:50 19人阅读 评论(0) 收藏
    C++ Virtual介绍 分类: C/C++ 2015-06-16 21:36 26人阅读 评论(0) 收藏
    Ubuntu vim+ ctags(包含系统函数) + taglist 配置 分类: vim ubuntu 2015-06-09 18:19 195人阅读 评论(0) 收藏
    Makefile 入门与基本语法 分类: C/C++ ubuntu 2015-05-18 11:16 466人阅读 评论(0) 收藏
    计算机视觉顶会 2015-05-03 16:17 47人阅读 评论(0) 收藏
    python如何使用 os.path.exists()--Learning from stackoverflow 分类: python 2015-04-23 20:48 139人阅读 评论(0) 收藏
    Python调用C可执行程序(subprocess) 分类: python 服务器搭建 C/C++ shell 2015-04-13 21:03 87人阅读 评论(0) 收藏
    C Struct Hack
  • 原文地址:https://www.cnblogs.com/wqbin/p/14638307.html
Copyright © 2020-2023  润新知