zoukankan      html  css  js  c++  java
  • Hive表库基本操作

    Hive的数据类型

    Hive的基本数据类型

    Hive的复杂数据类型

    复杂数据类型包括数组(ARRAY)、映射(MAP)和结构体(STRUCT),具体如下表所示:

     

    Hive的表库操作

    Hive的数据库操作

    Hive中数据库的概念本质上仅仅是表的一个目录或者命名空间。然而,对于具有  很多组和用户的大集群来说,这是非常有用的,因为这样可以避免表命名冲突。

    如果用户没有使用use关键字显示指定数据库,那么将会使用默认的数据库default。

    查看数据库

    show databases;

    使用like关键字实现模糊匹配

    show databases like 'hive_*'; 检索以hive开头的数据库

    使用数据库

    use  数据库名称;

    创建数据库

    create database  数据库名;

    删除数据库

    drop database  数据库名;(这种删除,需要将对应数据库中的表全部删除后才能删除数据库)

    drop database 数据库名 cascade;(强制删除,自行删除所有表)

    查看数据库的描述

    desc database 数据库名;

    Hive的数据表操作

    显示数据库中的表

    show tables;

    使用like关键字实现模糊匹配

    show tables like 'hive_*';

    显示表的详细信息

    desc [formatted] hive_01;(加上formatted显示的更详细

    创建数据表(与MySQL类似)

    create [external] table [if not exists] table_name 
    [(col_name data_type [comment col_comment], ...)]
    [comment table_comment]
    [partitioned by (col_name data_type [comment col_comment], ...)]
    [clustered by (col_name, col_name, ...)
    [sorted by (col_name [asc|desc], ...)] into num_buckets buckets]
    [row format row_format]
    [stored AS file_format]
    [location hdfs_path]
    上述字段解释说明:

     1: create table 创建一个指定名字的表,如果相同名字的表已经存在,则抛出异常;用户可以使用 IF NOT EXISTS来规避这个异常。

     2: external关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(location)。

     3: comment为表和列添加注释

     4: partitioned by创建分区表

     5: clustered by创建分桶表

     6: sorted by 排序

     7: row format

         delimited [fields terminated by char]

         [COLLECTION ITEMS TERMINATED BY char]

         [MAP KEYS TERMINATED BY char]

         [LINES TERMINATED BY char] | SERDE serde_name [WITHSERDEPROPERTIES(property_name=property_value,

         property_name=property_value, ...)]

    • fields terminated by char 列分隔符
    • COLLECTION ITEMS TERMINATED BY char 集合元素直接的分隔符
    • MAP KEYS TERMINATED BY char map集合KV的分隔符
    • 用户在建表的时候可以自定义SerDe或者使用自带的SerDe,如果没有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将会使用自带的SerDe,在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。

     8:stored as指定存储文件类型

            常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本 不指定默认)、RCFILE(列式存储格式文件)、ORCFILE(行列压缩存储文件)

            如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据是二进制文件,使用 STORED AS SEQUENCEFILE,如果数据需要压缩请使用 STORED AS RCFILE STORED AS ORCFILE

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

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

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

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

     9:location指定在HDFS上的存储位置

     10:like允许用户复制表的结构,但不复制数据。

    
    
    #使用数据库
    use text;
    #创建表
    create table [if not exists] test(
         id int,
         name string,
         hobby array<string>
         address map<string,string>
    )row format delimited
    fileds terminated by ' '
    connection items terminated by ':'
    map keys terminated by '~'
    #默认stored as储存文件类型是textfile
    #load加载数据(只有textfile类型的表才可以使用load)
    load data local inpath '/usr/test/movies.dat' overwrite into table movie


    #创建不同的文件储存类型
    create table [if not exists] test1(
         id int,
         name string,
         hobby array<string>
         address map<string,string>
    )
    stored as orcfile;

    #除了textfile类型的储存方式都得用insert加载数据
    insert overwrite table test1 select * from test;
     

     序列化器SerDe 

    //创建新表 指定SerDe 为RegexpSerDe正则
    use b01;
    create table reg_table(
         id int,
         name string
    ) row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
    with serdeproperties('input.regex'="id=(.*),name=(.*)"); //.代表单个字符 *  0~N次
    //加载数据
    load data local inpath '/usr/local/hive_data/regexp_test'  overwrite into table reg_table;
    
    //创建user用户数据的指定JSON的序列化器
    create  table user_json_textfile(
          uid string,
          phone string,
          addr string 
    ) row format serde 'org.apache.hive.hcatalog.data.JsonSerDe';
    
    load data local inpath '/usr/local/xl_project/user/user_login_info.json'  overwrite into table user_json_textfile;

    Hive内部表&&外部表

    未被external修饰的是内部表(managed table),被external修饰的为 外部表(external table)

    内外部表的区别:

    • 内部表数据由Hive管理,外部表数据由HDFS管理
    • 内部表的数据的存储位置是hive.metastore.warehouse.dir ,默认为/user/hive/warehouse中,外部表的数据存储位置由自己指定。
    • 删除内部表中的数据会直接删除元数据及存储数据;删除外部表仅仅会删除元数据,HDFS上的数据并不会被删除;
    • 对内部表的修改会将修改直接同步给元数据;而对外部表的表结构和分区进行修改,则需要MSCK REPAIR TABLE table_name(将HDFS上的元数据信息写入到metastore);   
    //创建外部表
    create external table outter_table(
        id int,
        name string,
        hobby array<string>,
        address map<string,string>
    )row format delimited 
    fields terminated by ','
    collection items terminated by '-'
    map keys terminated by ':'
    location '/outter/data'
    //向外部表中载入数据
    load data local inpath '/usr/local/person' into table outter_table;

    Hive表的修改操作

    表重命名

    Alter table 旧名称 RENAME to 新名称;

    alter table person rename to person_info;

    修改列信息

    Alter table 表名 CHANGE [COLUMN] 列名 新列名 数据类型

    [COMMENT 注释文本]

    [AFTER 字段名称|FIRST];

    //修改列名称
    alter table test1 change name tename string;
    //修改列类型
    alter table test1 change id id string;
    //指定列位置
    alter table test1 change id id string  first;

    这里会遇到类型兼容的问题,看下表:

    Hive数据类型之间的隐式转换

    增加列

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

     Alter table 表名 ADD COLUMNS(

                   列名 字段类型 [COMMENT ‘注释’],

                 ........

    );

    //增加列(可以一次添加多个)
    alter table test1 add columns(
         img string,
         addr string
    )

    删除或替换列 

    Alter table 表名 REPLACE COLUMNS(

    列名  字段类型  [COMMENT ‘注释’],

                   ............

    );

    //删除替换列
    alter table test1 replace columns(
         id string,
         name string,
         age string
    )

    修改表的存储属性

    Alter table表名 SET FILEFORMAT (TEXTFILE|SEQUENCEFILE|RCFILE|ORCFILE)

    会出现严重问题:(TEXTFILE的数据无法直接向RCFILE和ORCFILE导入,由于RCFILE

    与ORCFILE都是以块状存储数据,我们只能通过insert语句导入到一个ORCFILE或RCFILE的新表中)。快对快,行对行

    //修改表的存储结构
    alter table test1 set fileformat sequencefile

    设置表的注释

    alter table 表名 set tblproperties('属性名'='属性值');

    //设置表的注释
    alter table test1 set tblproperties('comment'='测试表')

    修改表的分隔符

    alter table 表名 set serdeproperties('属性名'='属性值');

    //修改表的分隔符
    alter table test1 set serdeproperties('field.delim'='~')

    查看表的详细的建表语句

    Show create table 表名;

    //展示创建表的详细信息
    show create table test1

    修改表的serde_class

    //修改表的序列化器
    alter table test1 set serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
    with serdeproperties ("input.regex" = "id=(.*),name=(.*),age=(.*)");

    Hive添加jar包

    add JAR '/usr/local/hive_data/hive-hcatalog-core-2.3.5.jar'(存放jar路径和jar名称)

    Hive的分区操作

    hive开发中,在存储数据时,为了更快地查询数据和更好地管理数据,都会对hive表中数据进行分区存储。所谓的分区,在hive表中体现的是多了一个字段。而在底  层文件存储系统中,比如HDFS上,分区则是一个文件夹,或者说是一个文件目录,不同的分区,就是数据存放在根目录下的不同子目录里,可以通过show partitions查看。

     静态分区

    //创建静态分区表
    create table test_partition (
    id string comment 'ID', 
    name string comment '名字') 
    comment '测试分区'
    partitioned by (year int comment '年')
    ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY ',' ;

     insert语句:

    //插入分区表数据(静态分区)
    insert into table test_partition partition(year=2000) values(1,'小明');
    insert into table test_partition partition(year=1999) values(2,'小红');
    insert into table test_partition partition(year=2000) values(3,'小兰');
    insert into table test_partition partition(year=1998) values(4,'小紫');

     load语句:

    load data local inpath '/usr/local/part_test' into table test_partition partition (year =2018);
    load data local inpath '/usr/local/part_test' into table test_partition partition (year =2018);
    load data local inpath '/usr/local/part_test' into table test_partition partition (year =2017);

     动态分区

     动态分区默认不开启,需要使用下列语句开启:

     set hive.exec.dynamic.partition.mode=nonstrict;#需退出hive,重新进入执行

    //创建动态分区
    create table test_partitions (
    id string comment 'ID', 
    name string comment '名字',
    year int comment '年'
    )comment '测试'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

     insert语句:

    insert into table test_partitions partition(year) values(5,'小白',2016);
    insert into table test_partitions partition(year) values(6,'小黑',2016);

     load语句:

    load data local inpath '/usr/local/part_test' into table test_partitions partition (year);

    修改分区

    指定到新分区目录下 原始分区仍旧存在 但是后续插入的新记录会存储到新分区中
    alter table test_partitions partition(year=2016) set location '/user/hive/warehouse/new_part/b01.db/test_partition/year=2016';

    删除分区

    alter table test_partitions drop partition(year=2016);

    同步到关系型数据库中的元信息

    MSCK REPAIR TABLE test_partitions;

    分桶表

    分桶表描述

    分桶是相对分区进行更细粒度的划分。分桶将整个数据内容安装某列属性值得hash值进行区分,如要安装name属性分为3个桶,就是对name属性值的hash 值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。

    //先设置一下分桶的权限
    set hive.enforce.bucketing=true;
    //
    创建分桶表 use test; create table student_bck (id int, name string) clustered by (id) sorted by (id desc) into 3 buckets row format delimited fields terminated by ",";
    //插入数据
    insert overwrite table student_bck select id,name from test_partition;
    //查询分桶数据
    select * from student_bck tablesample(bucket 3 out of 3 on id);

      tablesample (bucket x out of y on id);
      # x表示从哪个桶(x-1)开始,y代表分几个桶,也可以理解分x为分子,y为分母,及将表分为y份(桶),取第x份(桶)

    努力到无能为力,拼搏到感动自己
  • 相关阅读:
    开放GIS标准OGC之路(4)之 解密Filter(摘抄)
    在WCF中使用async/await 关键字的简化的异步编程模型(译)
    WinCE仿真器设置
    oracle PL/SQL编程详解
    oracle 日期格式
    钢笔工具使用教程
    使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明
    利用bitmap将图片部分颜色透明
    PS圆角图片并保留透明背景
    Script Debugger的使用
  • 原文地址:https://www.cnblogs.com/tkzm/p/11467054.html
Copyright © 2011-2022 走看看