zoukankan      html  css  js  c++  java
  • Hive-表库操作(二)

    1.Hive表文件的存储格式

      通过上述的stored as操作设置表的存储格式

      hive文件的存储格式分为以下四种:

        TEXTFILE,SEQUENCEFILE,RCFILE,ORCFILE

      其中TEXTFILE为默认格式,建表时不指定默认为这个格式,导入数据时直接把数据文件copy到HDFS上不进行处理;

      SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接从本地文件导入数据,数据要先导入textfile格式的表中,然后在从表中用insert导入SEQUENCEFILE,RCFILE,ORCFILE中;

      1.1 TEXTFILE格式

        默认格式,数据不做压缩,磁盘开销大,数据解析开销大;

        可结合Gzip,Bzip使用(系统自动检查,执行查询时解压),但使用这种方式,hive默认对数据不会切分,从而无法对数据进行并行操作;

        在反序列化的过程中,必须逐个字符判断是不是分隔符或行终止符,因此反序列化开销最大;

        1.1.1 创建一张UserInfo表:

    create table if not exists user_info(id bigint,username String,password String,sex String)row format delimited fields terminated by ' ' stored as textfile;

          

        1.1.2 使用load语句加载数据:   

    1 u1 p1 男
    2 u2 p2 男
    3 u3 p3 男
    4 u4 p4 男    

          

    load data local inpath '/opt/module/hive/data/user_info' overwrite into table user_info;

        1.1.3 查看表数据:

    select * from user_info;

          

      1.2 SEQUENCEFILE格式

        SequenceFile是hadoop API提供的一种二进制文件,它将数据以二进制的形式序列化到文件中;这种二进制文件内部使用hadoop的标椎的writeable接口实现序列化和反序列化;它与hadoop API中的MapFile是互相兼容的;Hive中的SequenceFile继承自hadoop API的SequenceFile,不过它的key为空,使用value存放实际的值,这样是为了避免MR在运行map阶段的排序过程;

        1.2.1 创建表:

    create table if not exists user_info_seq(id bigint,username String,password String,sex String)row format delimited fields terminated by '	' stored as sequencefile;

          

        1.2.2 数据导入:

    insert overwrite table user_info_seq select * from user_info;

          

        1.2.3 查看表数据:

    select * from user_info_seq;

          

      1.3 RCFILE格式

        RCFILE是一种行列存储相结合的存储方式;首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block;其次,块数据列式存储,有利于数据压缩和快速的列存放;

        1.3.1 创建表:

    create table if not exists user_info_rc(id bigint,username String,password String,sex String)row format delimited fields terminated by '	' stored as rcfile;

          

        1.3.2 数据导入:

    insert overwrite table user_info_rc select * from user_info;

        1.3.3 查看表数据:

    select * from user_info_rc;

           

      1.4 ORCFILE格式

        Orcfile(Optimized Row Columnar)是hive 0.11版里引入的新的存储格式,是对之前的RCFile存储格式的优化;

        可以看出每个Orc文件由一个或多个stripe(线条组成),每个stripe250MB大小,这个stripe实际相当于之前的rcfile里的RowGroup概念,不过大小由4MB->250MB,这样应该能提升顺序读的吞吐量;每个stripe里有三部分组成,分别是IndexData,Row Data,Stripe Footer:

          

          (1)Index Data:一个轻量级的index,默认是每隔1W行做一个索引;这里做的索引只是记录某行的各字段在Row Data中的offset;

          (2)Row Data:存的是具体的数据,和RCfile一样,先取部分行,然后对这些行按列进行存储;与RCfile不同的地方在于每个列进行了编码,分成多个stream来存储;

          (3)Stripe Footer:存的是各个stream的类型,长度等信息;

          每个文件有一个File Footer,这里面存的是stripe的行数,每个column的数据类型信息等;每个文件的尾部是一个PostScript,这里面记录了整个文件的压缩类型以及FileFooter的长度信息等;在读取文件时,会seek到文件尾部读PostScript,从里面解析到File Footer长度,再读File Footer,从里面解析到各个stripe信息,再读各个stripe,即从后往前读;

        1.4.1 创建数据表:

    create table if not exists user_info_orc(id bigint,username String,password String,sex String)row format delimited fields terminated by '	' stored as orcfile;

          

        1.4.2 数据导入:

    insert overwrite table user_info_orc select * from user_info;

        1.4.3 查看表数据:

    select * from user_info_orc;

          

      1.5 结论

        textfile:存储空间消耗比较大,并且压缩的text无法分割和合并,查询的效率最低,可以直接存储,加载数据的速度最高;

        sequencefile:存储空间消耗最大,压缩的文件可以分割和合并,需要通过text文件转化来加载;

        rcfile:存储空间小,查询的效率高,需要通过text文件转化来加载,加载的速度最低;

        orcfile:存储空间最小,查询的效率高,需要通过text文件转化来加载,加载的速度最低;

    2.Hive SerDe

      2.1 什么是SerDe

        SerDe是“Serializer and Deserializer”(序列化器和反序列化器的缩写);

        Hive使用SerDe读写表的行数据;

        HDFS FILEX-->InputFileFormat--><key,value>-->Deserializer-->Row Object;

        Row Object-->Serializer--><key,value>-->OutputFileFormat-->HDFS FILES;

        注意:“key”部分在读时被忽略,在写时始终是常量;基本上,row对象存储在value中序列化是对象转换为字节序列的过程;反序列化是字节序列恢复为对象的过程;对象的序列化主要由两种用途:对象的持久化,即把对象转换成字节序列后保存到文件中;对象数据的网络传送;除了上面两点,hive的序列化的作用还包括:Hive的反序列化是对key/value反序列化成hive table的每个列的值;Hive可以方便的将数据加载到列表中而不需要对数据进行转换,这样在处理海量数据时可以节省大量的时间;

        erDe说明hive如果去处理一条记录,包括Serialize/Deserilize两个功能,Serialize把hive使用的java object转换成能写入hdfs的字节序列,或者其他系统能识别的流文件;Deserilize把字符串或者二进制流转换成hive能识别的java object对象;比如:select语句会用到Serialize对象,把hdfs数据解析出来;insert语句会使用Deserilize对象,数据写入hdfs系统,需要把数据序列化;

        Hive的一个原则是Hive不拥有HDFS文件格式;用户应该能够使用工具直接读取Hive表的HDFS文件或者使用其他工具直接写那些可以加载外部表的HDFS文件;

      2.2 RegExpSerDe的用法

        2.2.1 数据准备:

    id=123,name=wldy
    id=55,name=qtxsn
    id=666,name=sjdf
    Id=345,name=zs

        2.2.2 期望输出格式: 

    123  wldy
    55  qtxsn
    666  sjdf
    345  zs

        2.2.3 创建表:

          input.regex(按照输入的正则匹配)

    create table test1(id int,name String)row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe' with serdeproperties ("input.regex"="id=(.*),name=(.*)") stored as textfile;

          

        2.2.4 加载数据:

    load data local inpath '/opt/module/hive/data/regexptest' overwrite into table test1;

        2.2.5 查询表数据:

    select * from test1;

          

      2.3 JsonSerDe的用法

        2.3.1 数据准备:

    {"id":1, "create_at":"20190317", "text":"你好", "user_info":{"id":"1","name":"binghe01"}}
    {"id":2, "create_at":"20190317", "text":"Hello", "user_info":{"id":"2","name":"binghe02"}}

          需要注意的问题:每行必须是一个完整的JSON,一个JSON串不能跨越多行,原因是hadoop是依赖换行符分割文件的;

        2.3.2 创建表:

    create table jsonMessage(id int,create_at String,text String,user_info map<String,String>)row format SerDe 'org.apache.hive.hcatalog.data.JsonSerDe';

          

        2.3.3 加载数据:   

    load data local inpath '/opt/module/hive/data/json' overwrite into table jsonMessage;

        2.3.4 查询表数据:

    select * from jsonMessage;

          

    3.Hive表的修改操作

      大多数的表属性可以通过ALTER TABLE语句来进行修改;这种操作会修改元数据,但不会修改数据本身;

      3.1 表重命名

        语法:Alter table 旧名称 RENAME to 新名称;

    Alter table hive_test RENAME to hive_demo;

        

      3.2 修改列信息

        语法:Alter table 表名 CHANGE [COLUMN] 列名 新列名 数据类型 [COMMENT 注释文本] [AFTER 字段名称|FIRST];

        注意:即使字段名和类型没有改变,用户也需要完全指定旧的字段名,并给出新的字段名和字段类型;COMMENT与AFTER关键字可以省去,COMMENT关键字的所用是为列声明新的注释,AFTER关键字的作用是将当前修改的列防止对应字段名称之后,如果要放在最前面,则使用FIRST关键字代替;

          

    Alter table hive_demo CHANGE id pid bigint;

          

      3.3 增加列

        Hive能将新的字段添加到已有字段之后;

        语法:Alter table 表名 ADD COLUMNS(列名 字段类型[COMMENT '注释'],......);

    Alter table hive_demo ADD columns (sex String);

          

      3.4 删除或替换列

        语法:Alter table 表名 REPLACE COLUMNS (列名 字段类型 [COMMENT '注释'],......);

    Alter table hive_demo REPLACE columns (name String);

          

      3.5 修改表的存储属性

        语法:Alter table 表名 SET FILEFORMAT(TEXTFILE|SEQUENCEFILE|RCFILE|ORCFILE);    

    Alter table hive_demo SET FILEFORMAT ORCFILE;

      3.6 修改表的普通属性

        语法:Alter table 表名 SET TBLPROPERTIES('属性名'='属性值');

    Alter table hive_demo set tblproperties('comment','best!');

      3.7 修改表的SerDe格式

        语法:Alter table 表名 SET SERDEPROPERTIES('属性名'='属性值');

      3.8 查看表的详细建表语句

        语法:Show create table 表名;

    Show create table hive_demo;

          

  • 相关阅读:
    Vue项目搭建及原理三
    Vue项目搭建及原理一
    JS Cookie丢失问题
    1027 Colors in Mars
    1028 List Sorting
    1029 Median
    1030 Travel Plan
    1031 Hello World for U
    1032 Sharing
    1033 To Fill or Not to Fill
  • 原文地址:https://www.cnblogs.com/wnwn/p/12747320.html
Copyright © 2011-2022 走看看