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 上表目录的子目录,数据按照分区存储在子 ...
随机推荐
- GGPLOT2-plotly |让你的火山图“活”过来
火山图(Volcano Plot)常用于展示基因表达差异的分布,横坐标常为Fold change(倍数),越偏离中心差异倍数越大;纵坐标为P值(P值),值越大差异越显着.原因得名也许的英文因为查询查询 ...
- 箭头函数=>
箭头函数特点一:没有自己的this对象,其this对象为所在环境 特点二 :没有arguments参数 可以用...rest代替特点三:不能使用构造函数,不可使用new命令,否则会报错 //函数的扩展 ...
- apache安装zip包安装(非exe)
安装步骤如下: (1) 下载apache安装程序 进入官网:选择一个版本的apache 选择红色区域的内容,在之后进入的页面中: 选择红色区域的内容,进入页面: 现则VC9的进行下载. (2) 安装 ...
- Java几种常见的排序算法
一.所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法.排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面. ...
- Jenkins 持续集成持续发布使用搭建基础
一.环境搭建基础 1.持续集成.持续交付.持续部署概念 ①.集成: 是指软件多人研发的部分软件代码整合交付,以便尽早发现个人开发部分的问题:持续集成:强调开发人员提交了新代码之后,立刻进行构建(单元) ...
- 洛谷P2125 题解
吐槽: 只能说这道题很数学,本数学蒟蒻推了半天没推出来,只知道要用绝对值,幸亏教练提醒,才勉强想出正解(似乎不是这样的),真的是很无语. 以上皆为吐槽本题,可直接 跳过 分析: 既然题目是要使书架上的 ...
- Redhat 离线安装 Docker (Community from binaries)
需求 在离线环境安装Docker (Community版),因为Enterprise版要花钱.当然资金充裕的客户可参考https://docs.docker.com/install/linux/doc ...
- git的使用学习笔记
一.git Git 是一个开源的分布式版本控制系统,项目版本管理工具,可以在本地提交修改再合并到主分支上,最为出色的是它的合并跟踪(merge tracing)能力. 可以通过Linux命令进行增加, ...
- hadoop学习(四)----windows环境下安装hadoop
因为我们不能在线上环境进行调试hadoop,这样就只能在本地先调试好了再放到线上去啦.我本地是windows环境,今天先记下windows下搭建hadoop2.7的步骤. 1 本地环境 windows ...
- android ——Tablayout
Tabs make it easy to explore and switch between different views. 通过TabLayout可以在一个活动中通过滑动或者点击切换到不同的页面 ...