hive 四种表,分区表,内部,外部表,桶表

Hive四大表类型内部表、外部表、分区表和桶表

一、概述

总体上Hive有四种表:外部表,内部表(管理表),分区表,桶表。分别对应不同的需求。下面主要讲解各种表的适用情形、创建和加载数据方法。

二、具体内容

1.内部表

创建内部表和加载数据

  1. create table emp_inner(

  2.  

    empno int,

  3.  

    ename string,

  4.  

    job string,

  5.  

    mgr int,

  6.  

    hiredate string,

  7.  

    sal double,

  8.  

    comm double,

  9.  

    deptno int

  10.  

    )

  11.  

    row format delimited fields terminated by ‘\t‘

  12.  

    LOCATION ‘/user/hive/warehouse/hadoop.db/emp‘;

2.外部表

(1)适用情形:

当一份日志需要多个小组一起分析,分析完了之后创建的表就可以删除了。但是普通的表删除的同时也会把数据删除,这样就会影响到其他小组的分析,而且日志数据也不能随便删除。所以,需要外部表,删除外部表,不会删除对应的hdfs上的数据。

(2)创建外部表

  1. create EXTERNAL table dept_ext(

  2.  

    deptno int,

  3.  

    dname string,

  4.  

    loc string

  5.  

    )

  6.  

    row format delimited fields terminated by ‘\t‘ ;

  7.  

    load data local inpath ‘/opt/datas/dept.txt‘ into table dept_ext;

(3)对比外部表和内部表区别
    删除外部表,数据不会有任何改变,只是mysql中的元数据被修改,但是删除内部表(管理表),数据就会被删除。

总结:hive内部表和外部表的区别
        1)创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。
        2)删除表时:在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据

3、临时表

(1)适用情形

临时分析,在关闭hive客户端后,临时表就会消失。主要用于存储不重要中间结果集,不重要的表。

(2)创建临时表并加载数据

  1. create TEMPORARY table dept_tmp(

  2.  

    deptno int,

  3.  

    dname string,

  4.  

    loc string

  5.  

    )

  6.  

    row format delimited fields terminated by ‘\t‘;

  7.  

  8.  

    load data local inpath ‘/opt/datas/dept.txt‘ into table dept_tmp;

(3)查看location信息

  1. desc formatted dept_tmp;

  2.  

    Location: hdfs://172.19.199.187:8020/tmp/hive/hadoop/68174383-f427-4629-9707-0ab1c9b07726/_tmp_space.db/d872efec-1294-48b0-9071-31cf98d46400

  3.  

    Table Type: MANAGED_TABLE

4、分区表【***】

(1)适用情形

普通的表:select * from logs where date = ‘20171209‘,执行流程:对全表的数据进行查询,然后才过滤操作。

分区表:select * from logs where date = ‘20171209‘,执行流程:直接加载对应文件路径下的数据。适用于大数据量,可以通过分区快速定位需要查询的数据,分区表的作用主要是提高了查询检索的效率 。

(2)创建一级分区并且加载数据

  1. create table emp_part(

  2.  

    empno int,

  3.  

    ename string,

  4.  

    job string,

  5.  

    mgr int,

  6.  

    hiredate string,

  7.  

    sal double,

  8.  

    comm double,

  9.  

    deptno int

  10.  

    )partitioned by (`datetime` string)

  11.  

    row format delimited fields terminated by ‘\t‘;

  12.  

  13.  

    load data local inpath ‘/opt/datas/emp.txt‘ into table emp_part partition(`datetime`=‘20171209‘);

  14.  

    load data local inpath ‘/opt/datas/emp.txt‘ into table emp_part partition(`datetime`=‘20171208‘);

  15.  

    【在hdfs上形成两个文件夹,emp.txt存储在里面】

  16.  

    /user/hive/warehouse/hadoop.db/emp_part/datetime=20171208

  17.  

    /user/hive/warehouse/hadoop.db/emp_part/datetime=20171209

  18.  

  19.  

    查询结果:

  20.  

    select * from emp_part where `datetime` = ‘20171209‘;

(3)创建二级分区并且加载数据

  1. create table emp_part2(

  2.  

    empno int,

  3.  

    ename string,

  4.  

    job string,

  5.  

    mgr int,

  6.  

    hiredate string,

  7.  

    sal double,

  8.  

    comm double,

  9.  

    deptno int

  10.  

    )partitioned by (`datetime` string,hour string)

  11.  

    row format delimited fields terminated by ‘\t‘;

  12.  

  13.  

    load data local inpath ‘/opt/datas/emp.txt‘ into table emp_part2 partition(`datetime`=‘20171209‘,hour=‘01‘);

  14.  

  15.  

    load data local inpath ‘/opt/datas/emp.txt‘ into table emp_part2 partition(`datetime`=‘20171209‘,hour=‘02‘);

  16.  

    【在hdfs上,形成目录】

  17.  

    /user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209/hour=01

  18.  

    /user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209/hour=02

查询结果:

  1. -》select * from emp_part2 where `datetime` = ‘20171209‘;

  2.  

    查看/user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209内的所有数据(即两倍的emp.txt数据)

  3.  

    -》select * from emp_part2 where `datetime` = ‘20171209‘ and hour = ‘01‘;

  4.  

    查看/user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209/hour=01内的所有数据(即emp.txt数据)

(4)创建外部分区表(删除的时候,只是元数据删除,数据是不会删除的)

  1. create EXTERNAL table emp_test(

  2.  

    empno int,

  3.  

    ename string,

  4.  

    job string,

  5.  

    mgr int,

  6.  

    hiredate string,

  7.  

    sal double,

  8.  

    comm double,

  9.  

    deptno int

  10.  

    )

  11.  

    PARTITIONED BY(date string,hour string)

  12.  

    row format delimited fields terminated by ‘\t‘;

(5)加载分区表数据方法

(a)直接通过load命令(指定partition),加载数据到表的某个分区中,select是可以查询到的。

load data local inpath ‘/opt/datas/emp.txt‘ into table emp_part2 partition(`datetime`=‘20171209‘,hour=‘01‘);

(b)手动创建目录/user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209/hour=03,然后put上数据,表select查询是查询不到的。然后,使用alter将路径添加到原数据库mysql数据库中。

alter table emp_part2 add partition(`datetime`=‘20171209‘,hour=‘03‘);

5、桶表

(1)使用情形

数据有严重的数据倾斜,分布不均匀,但是相对来说每个桶中的数据量会比较平均。桶于桶之间做join等查询的时候,会有优化。

(2)创建并使用

首先,

 set hive.enforce.bucketing = true; 

然后,

  1. create table emp_bu(

  2.  

    empno int,

  3.  

    ename string,

  4.  

    job string,

  5.  

    mgr int,

  6.  

    hiredate string,

  7.  

    sal double,

  8.  

    comm double,

  9.  

    deptno int

  10.  

    )CLUSTERED BY(deptno) INTO 4 BUCKETS

  11.  

    row format delimited fields terminated by ‘\t‘;

最后加载数据,使用insert

insert overwrite table emp_bu_2 select * from emp;也可以指定分区写入 insert overwrite

原文地址:https://www.cnblogs.com/Mr--zhao/p/11454582.html

时间: 2024-11-05 19:26:32

hive 四种表,分区表,内部,外部表,桶表的相关文章

Hive学习(七)Hive四种数据导入方式

Hive的几种常见的数据导入方式 这里介绍四种: (1).从本地文件系统中导入数据到Hive表: (2).从HDFS上导入数据到Hive表: (3).从别的表中查询出相应的数据并导入到Hive表中: (4).在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中. 一.从本地文件系统中导入数据到Hive表 先在Hive里面创建好表,如下: hive> create table wyp > (id int, name string, > age int, tel string)

【hive】——Hive四种数据导入方式

Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中. 一.从本地文件系统中导入数据到Hive表 先在Hive里面创建好表,如下: hive> create table wyp > (id int, name string, > age int, tel string) >

Hive总结(七)Hive四种数据导入方式

MySQL表的四种分区类型

MySQL表的四种分区类型 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区.当然也可根据其他的条件分区. 二.为什么要对表进行分区 为了改善大型表以及具有各种访问模式的表的可伸缩性,可管理性和提高数据库效率. 分区的一些优点包括: 与单个磁盘或文件系统分区相比,可以存储更多的数据. 对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有

久未更 ~ 五之 —— 引入外部CSS样式表 小节

> > > > > 久未更 系列一:在html中引入外部css样式表 1 //引入外部css样式表 2 //<lilnk>要放在<head>标签的第一行,否则不起作用 3 //如下 4 <head> 5 <link rel="stylesheet" type="text/css" href="waibu.css"> 6 <meta charset="ut

Hive探秘--内部表、外部表、分区表、桶表研究

Hive知识 一.建表语法 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, ...) [SORTE

Hive 外部表 分区表

  之前主要研究oracle与mysql,认为hive事实上就是一种数据仓库的框架,也没有太多另类,所以主要精力都在研究hadoop.hbase,sqoop,mahout,近期略微用心看了下hive.事实上hive还是比我想象中好用的多,心里有点点暗爽,不论是与hadoop的衔接,还是在对外查询分析,定期hsql生成报表方面,都很方便.能够不用mapreduce.直接用hive生成报表. 真是方便.  Hive 提供两者表的两种使用方式,一种是内部表(托管表),第二种就是外部表. 对于两种表的使

HIVE外部表 分区表

HIVE外部表 分区表    外部表        创建hive表,经过检查发现TBLS表中,hive表的类型为MANAGED_TABLE. 在真实开发中,很可能在hdfs中已经有了数据,希望通过hive直接使用这些数据作为表内容.        此时可以直接创建出hdfs文件夹,其中放置数据,再在hive中创建表管来管理,这种方式创建出来的表叫做外部表. #创建目录,上传已有文件        hadoop fs -mkdir /data        hadoop fs -put stude

hive 分区表、桶表和外部表

1:分区表 图:创建分区表 图:导入数据 图:在HDFS的显示信息 分区字段就是一个文件夹的标识 图:在多列上创建分区 图:导入数据 图:在多列上建立分区后在HDFS上形成的结构信息 把表中的大多数字段建立为分区字段,可行吗?分区不是越多越好,分区越多的话,加载数据的话必须注意分区,那么文件会被控制的非常小,Map的任务数量增多, 计算不一定会快.Hive限定了分区的数量.选用一些查询比较频繁的字段来建立分区,时间字段等. 查询比较频繁,并且不会有很多枚举值的字段,适合作为分区字段.分区字段就是