hive 四种表,分区表,内部,外部表,桶表
Hive四大表类型内部表、外部表、分区表和桶表
一、概述
总体上Hive有四种表:外部表,内部表(管理表),分区表,桶表。分别对应不同的需求。下面主要讲解各种表的适用情形、创建和加载数据方法。
二、具体内容
1.内部表
创建内部表和加载数据
- create table emp_inner(
 - empno int,
 - ename string,
 - job string,
 - mgr int,
 - hiredate string,
 - sal double,
 - comm double,
 - deptno int
 - )
 - row format delimited fields terminated by '\t'
 - LOCATION '/user/hive/warehouse/hadoop.db/emp';
 
2.外部表
(1)适用情形:
当一份日志需要多个小组一起分析,分析完了之后创建的表就可以删除了。但是普通的表删除的同时也会把数据删除,这样就会影响到其他小组的分析,而且日志数据也不能随便删除。所以,需要外部表,删除外部表,不会删除对应的hdfs上的数据。
(2)创建外部表
- create EXTERNAL table dept_ext(
 - deptno int,
 - dname string,
 - loc string
 - )
 - row format delimited fields terminated by '\t' ;
 - load data local inpath '/opt/datas/dept.txt' into table dept_ext;
 
(3)对比外部表和内部表区别
    删除外部表,数据不会有任何改变,只是mysql中的元数据被修改,但是删除内部表(管理表),数据就会被删除。
总结:hive内部表和外部表的区别
        1)创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。
        2)删除表时:在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据
3、临时表
(1)适用情形
临时分析,在关闭hive客户端后,临时表就会消失。主要用于存储不重要中间结果集,不重要的表。
(2)创建临时表并加载数据
- create TEMPORARY table dept_tmp(
 - deptno int,
 - dname string,
 - loc string
 - )
 - row format delimited fields terminated by '\t';
 - load data local inpath '/opt/datas/dept.txt' into table dept_tmp;
 
(3)查看location信息
- desc formatted dept_tmp;
 - Location: hdfs://172.19.199.187:8020/tmp/hive/hadoop/68174383-f427-4629-9707-0ab1c9b07726/_tmp_space.db/d872efec-1294-48b0-9071-31cf98d46400
 - Table Type: MANAGED_TABLE
 
4、分区表【***】
(1)适用情形
普通的表:select * from logs where date = '20171209',执行流程:对全表的数据进行查询,然后才过滤操作。
分区表:select * from logs where date = '20171209',执行流程:直接加载对应文件路径下的数据。适用于大数据量,可以通过分区快速定位需要查询的数据,分区表的作用主要是提高了查询检索的效率 。
(2)创建一级分区并且加载数据
- create table emp_part(
 - empno int,
 - ename string,
 - job string,
 - mgr int,
 - hiredate string,
 - sal double,
 - comm double,
 - deptno int
 - )partitioned by (`datetime` string)
 - row format delimited fields terminated by '\t';
 - load data local inpath '/opt/datas/emp.txt' into table emp_part partition(`datetime`='20171209');
 - load data local inpath '/opt/datas/emp.txt' into table emp_part partition(`datetime`='20171208');
 - 【在hdfs上形成两个文件夹,emp.txt存储在里面】
 - /user/hive/warehouse/hadoop.db/emp_part/datetime=20171208
 - /user/hive/warehouse/hadoop.db/emp_part/datetime=20171209
 - 查询结果:
 - select * from emp_part where `datetime` = '20171209';
 
(3)创建二级分区并且加载数据
- create table emp_part2(
 - empno int,
 - ename string,
 - job string,
 - mgr int,
 - hiredate string,
 - sal double,
 - comm double,
 - deptno int
 - )partitioned by (`datetime` string,hour string)
 - row format delimited fields terminated by '\t';
 - load data local inpath '/opt/datas/emp.txt' into table emp_part2 partition(`datetime`='20171209',hour='01');
 - load data local inpath '/opt/datas/emp.txt' into table emp_part2 partition(`datetime`='20171209',hour='02');
 - 【在hdfs上,形成目录】
 - /user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209/hour=01
 - /user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209/hour=02
 
查询结果:
- -》select * from emp_part2 where `datetime` = '20171209';
 - 查看/user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209内的所有数据(即两倍的emp.txt数据)
 - -》select * from emp_part2 where `datetime` = '20171209' and hour = '01';
 - 查看/user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209/hour=01内的所有数据(即emp.txt数据)
 
(4)创建外部分区表(删除的时候,只是元数据删除,数据是不会删除的)
- create EXTERNAL table emp_test(
 - empno int,
 - ename string,
 - job string,
 - mgr int,
 - hiredate string,
 - sal double,
 - comm double,
 - deptno int
 - )
 - PARTITIONED BY(date string,hour string)
 - 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; 
然后,
- create table emp_bu(
 - empno int,
 - ename string,
 - job string,
 - mgr int,
 - hiredate string,
 - sal double,
 - comm double,
 - deptno int
 - )CLUSTERED BY(deptno) INTO 4 BUCKETS
 - row format delimited fields terminated by '\t';
 
最后加载数据,使用insert
insert overwrite table emp_bu_2 select * from emp;
也可以指定分区写入 insert overwrite
hive 四种表,分区表,内部,外部表,桶表的更多相关文章
- 【hive】——Hive四种数据导入方式
		
Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在 ...
 - Hive四种数据导入方式介绍
		
问题导读 1.从本地文件系统中通过什么命令可导入数据到Hive表? 2.什么是动态分区插入? 3.该如何实现动态分区插入? 扩展: 这里可以和Hive中的三种不同的数据导出方式介绍进行对比? Hive ...
 - java 四种内部类和内部接口
		
/** * 常规内部类:常规内部类没有用static修饰且定义在在外部类类体中. * 1.常规内部类中的方法可以直接使用外部类的实例变量和实例方法. * 2.在常规内部类中可以直接用内部类创建对象 * ...
 - hive四种排序
		
order by order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)只有一个reducer,会导致当输入规模较大时,需要较长的计算时间. set h ...
 - Hive总结(七)Hive四种数据导入方式
 - 分区表,桶表,外部表,以及hive一些命令行小工具
		
hive中的表与hdfs中的文件通过metastore关联起来的.Hive的数据模型:内部表,分区表,外部表,桶表受控表(managed table):包括内部表,分区表,桶表 内部表: 我们删除表的 ...
 - Hive 学习之路(五)——  Hive 分区表和分桶表
		
一.分区表 1.1 概念 Hive中的表对应为HDFS上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为HDFS上表目录的子目录,数据按照分区存储在子目录中.如 ...
 - Hive 系列(五)—— Hive 分区表和分桶表
		
一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...
 - 入门大数据---Hive分区表和分桶表
		
一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...
 
随机推荐
- mysql整数类型int后面的长度有什么意义
			
int 的 SQL-92 同义字为 integer.SQL-92 是数据库的一个标准. int类型的存储大小为4个字节 unsigned(无符号) int 存储范围是 2^4*8 int(M) 中的M ...
 - java连接mysql数据库jdbc
			
jdbc.driver = com.mysql.jdbc.Driverjdbc.url = jdbc:mysql://localhost:3306/数据库名jdbc.username = rootjd ...
 - docker挂载volume的用户权限问题,理解docker容器的uid
			
docker挂载volume的用户权限问题,理解docker容器的uid 在刚开始使用docker volume挂载数据卷的时候,经常出现没有权限的问题. 这里通过遇到的问题来理解docker容器用户 ...
 - Svn提交冲突问题
			
MEclipse中的svn冲突解决办法: 1. 点击提交,报错——‘SVN提交’has encountered a problem. 2. 选中无法提交的文件,点击更新操作 ...
 - Wtm携手LayUI -- .netcore 开源生态我们是认真的!
			
经过WTM团队和LayUI团队多次深入协商,双方于2019年7月29日在北京中国国际展览中心正式达成战略合作意向, 双方签署了战略合作框架协议,LayUI团队承诺使用WTM框架的任何项目都可以免费使用 ...
 - Android平台使用Ceres Solver
			
在Android平台上使用Ceres求解器,官方教程不明确,且编译过程遇到了很多问题. 环境 Ubuntu 18.04 源代码 https://github.com/Great-Keith/ceres ...
 - 浅谈NodeJS多进程服务架构基本原理
			
阅读目录 一:nodejs进程进化及多进程架构原理 二:node中child_process模块实现多进程 三:父子进程间如何通信? 四:理解cluster集群 回到顶部 一:nodejs进程进化及多 ...
 - SpringBoot:如何优雅地处理全局异常?
			
之前用springboot的时候,只知道捕获异常使用try{}catch,一个接口一个try{}catch,这也是大多数开发人员异常处理的常用方式,虽然屡试不爽,但会造成一个问题,就是一个Contro ...
 - Scala集合(四)
			
1. 集合 集合主要有三种: Sequence Map Set sequence是一种线性元素的集合,可能会是索引或者线性的(链表).map是包含键值对的集合,就像Java的Map,set是包含无重复 ...
 - UML类图(1.3)
			
UML:Unified modeling Language 统一建模语言 UML类图:用来描述系统所包含的类以及类之间的关系. 画图工具:https://www.processon.com 类之间的6 ...