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;

          

  • 相关阅读:
    洛谷 1339 最短路
    洛谷 1330 封锁阳光大学 图论 二分图染色
    洛谷 1262 间谍网络 Tarjan 图论
    洛谷 1373 dp 小a和uim之大逃离 良心题解
    洛谷 1972 莫队
    洛谷 2158 数论 打表 欧拉函数
    洛谷 1414 数论 分解因数 水题
    蒟蒻的省选复习(不如说是noip普及组复习)————连载中
    关于筛法
    关于整数划分的几类问题
  • 原文地址:https://www.cnblogs.com/wnwn/p/12747320.html
Copyright © 2011-2022 走看看