一起学Hive——创建内部表、外部表、分区表和分桶表及导入数据
Hive本身并不存储数据,而是将数据存储在Hadoop的HDFS中,表名对应HDFS中的目录/文件。根据数据的不同存储方式,将Hive表分为外部表、内部表、分区表和分桶表四种数据模型。每种数据模型各有优缺点。通过create user命令创建user表时,会在HDFS中生成一个user目录/文件。
外部表
数据不由Hive管理,使用drop命令删除一个表时,只是把表的元数据给删除了,而表的数据不会删除。
创建外部表的SQL语句:
create external table bigdata17_user(
userid int,
username string,
fullname string)
row format delimited fields terminated by ','
lines terminated by '\n';
在hive的命令行中执行 show tables;sql语句,会看到bigdata17_user的表。

通过执行hadoop fs -ls /user/hive/warehouse/bigdata17.db/bigdata17_user 命令,可以看到在HDFS中有一个bigdata17_user的目录。这时候文件夹下面是没有数据的,因为还没有导入数据。bigdata17.db是数据库名,hive默认的数据库是default。

执行SQL语句:load data inpath '/data/user.csv' overwrite into table bigdata17_user;导入数据到bigdata17_user表中。
执行hadoop fs -ls /user/hive/warehouse/bigdata17.db/bigdata17_user命令,就看到该目录下面有个user.csv的文件。

通过drop table bigdata17_user;语句删除表。
然后执行show tables语句,发现该表已经不存在。
我们再次执行hadoop fs -ls /user/hive/warehouse/bigdata17.db/bigdata17_user,发现bigdata17_user目录还存在,目录中还有user.csv文件。

通过上述的操作,验证了使用drop删除表时是不会删除外部表的数据。而我们要恢复外部表只需再次执行创建bigdat17_user表的SQL即可:
create external table bigdata17_user(
userid int,
username string,
fullname string)
row format delimited fields terminated by ','
lines terminated by '\n';
内部表
内部表(有些人会翻译成管理表)的数据由hive管理,当使用drop删除表时,会把表的元数据和数据一起删除,数据无法恢复,因此一定要慎用drop删除内部表。
创建内部表的sql语句:
create table bigdata17_user( userid int, username string, fullname string)
row format delimited fields terminated by ','
lines terminated by '\n';
和外部表创建的语法基本一样,只是创建外部表需要使用external关键字。没有external关键字则是创建内部表。
分区表
内部表和外部表都可以使用分区的功能,使用分区的内部或外部表称为分区表。
创建分区表的语句:
create external table bigdata17_user_partition(
username string,
fullname string)
partitioned by(userid string)
row format delimited fields terminated by ','
lines terminated by '\n';
往分区表导入数据分为静态分区导入和动态分区导入,静态分区是在导入语句中指定分区值,例如:
insert overwrite table bigdata17-user_parttion
partition(userid=1)
select username ,fullname from bigdata17_user;
该语句的分区值默认是1,如果有多个分区值,必须写多个sql语句,效率低下。
一般情况在我们都是使用动态分区导入数据,
在导入数据之前必须执行下面的两条语句让hive支持动态分区功能,默认是不支持动态分区的。
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
动态分区导入数据的sql语句:
insert overwrite table bigdata17_user_partition
partition(userid)
select username ,fullname,userid from bigdata17_user;
我们来看下分区表的数据在hdfs中是以何种形式组织存放的,执行hadoop fs -ls /user/hive/warehouse/bigdata17.db/bigdata17_user_partition命令,会看到下图的内容:

因为bigdata17_user_partition表是按照userid字段进行分区的,bigdata17_user_partition一共有1、2和3的三个数值,因此有3个文件。由此可见,分区字段有多少个不同的值,就有几个文件。相同分区的数据存放在同一个文件中。
注意:在使用insert overwrite table select方式导入数据到分区表时,有多个分区字段时,分区partition中的字段顺序必须和select字段的顺序一致。
分桶表
分桶是将某个字段取哈希值,值相同的数据分发到一个桶中。在创建分桶表的时候必须指定分桶的字段,并且指定要分桶的数量。
创建分桶表对SQL语句如下:
create table bigdata17_user_bucket( userid int, username string, fullname string)
clustered by(userid) into 2 buckets
row format delimited fields terminated by ','
lines terminated by '\n';
导入数据到bigdata17_user_bucket分桶表中的步骤:
- 设置使用分桶属性:
set hive.enforce.bucketing = true。 - 执行SQL语句
insert overwrite table bigdata17_user_bucket
select userid,username ,fullname from bigdata17_user;
执行 hadoop fs -ls /user/hive/warehouse/bigdata17.db/bigdata17_user_bucket命令,会看到bigdata17_user_bucket目录中有两个文件。

其中userid为1和3的数据写入到000001_0文件中,userid为2的数据写入到000000_0的文件中。
注意:分区和分桶都是按字段来组织数据的存放,分区是相同的字段值存放在一个文件中,而分桶是字段哈希值相同的数据存放在一个文件中。
一起学Hive——创建内部表、外部表、分区表和分桶表及导入数据的更多相关文章
- Hive 学习之路(五)—— Hive 分区表和分桶表
一.分区表 1.1 概念 Hive中的表对应为HDFS上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为HDFS上表目录的子目录,数据按照分区存储在子目录中.如 ...
- Hive 系列(五)—— Hive 分区表和分桶表
一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...
- 入门大数据---Hive分区表和分桶表
一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...
- hive 分区表和分桶表
1.创建分区表 hive> create table weather_list(year int,data int) partitioned by (createtime string,area ...
- Hive SQL之分区表与分桶表
Hive sql是Hive 用户使用Hive的主要工具.Hive SQL是类似于ANSI SQL标准的SQL语言,但是两者有不完全相同.Hive SQL和Mysql的SQL方言最为接近,但是两者之间也 ...
- Hive 教程(四)-分区表与分桶表
在 hive 中分区表是很常用的,分桶表可能没那么常用,本文主讲分区表. 概念 分区表 在 hive 中,表是可以分区的,hive 表的每个区其实是对应 hdfs 上的一个文件夹: 可以通过多层文件夹 ...
- Hive(六)【分区表、分桶表】
目录 一.分区表 1.本质 2.创建分区表 3.加载数据到分区表 4.查看分区 5.增加分区 6.删除分区 7.二级分区 8.分区表和元数据对应得三种方式 9.动态分区 二.分桶表 1.创建分桶表 2 ...
- Hive的分桶表
[分桶概述] Hive表分区的实质是分目录(将超大表的数据按指定标准细分到指定目录),且分区的字段不属于Hive表中存在的字段:分桶的实质是分文件(将超大文件的数据按指定标准细分到分桶文件),且分桶的 ...
- 大数据学习----day27----hive02------1. 分桶表以及分桶抽样查询 2. 导出数据 3.Hive数据类型 4 逐行运算查询基本语法(group by用法,原理补充) 5.case when(练习题,多表关联)6 排序
1. 分桶表以及分桶抽样查询 1.1 分桶表 对Hive(Inceptor)表分桶可以将表中记录按分桶键(某个字段对应的的值)的哈希值分散进多个文件中,这些小文件称为桶. 如要按照name属性分为3个 ...
随机推荐
- 【转】Leveldb源码分析——1
先来看看Leveldb的基本框架,几大关键组件,如图1-1所示. Leveldb是一种基于operation log的文件系统,是Log-Structured-Merge Tree的典型实现.LSM源 ...
- Spring HibernateTemplate与HibernateDaoSupport对比
HibernateTemplate与HibernateDaoSupport两者都是spring整合hibernate提供的模板技术. 对于保存一个对象,HibernateTemplate需要先配置 配 ...
- python操作mysql数据库增删改查的dbutils实例
python操作mysql数据库增删改查的dbutils实例 # 数据库配置文件 # cat gconf.py #encoding=utf-8 import json # json里面的字典不能用单引 ...
- 转载:UML学习(一)-----用例图 (silent)
原文:http://www.cnblogs.com/silent2012/archive/2011/09/07/2169518.html 1.什么是用例图 用例图源于Jacobson的OOSE方法,用 ...
- python学习第5天
数据类型:字典 字典 why: 列表的缺点: 1,列表如果存储的数据比较多,那么他的查询速度相对慢. 2,列表存储的数据关联性不强. what: python基础数据类型之一:字典. python中唯 ...
- MySQL将查询出来的一组数据拼装成一个字符串
1 前言 由于项目中有一个需求,需要把当日当周的排行榜数据归档,以便后期查询和发放奖励.然而发现,mysql的变量只能存一个变量值,然后如果要储存一条记录,可以使用CONCAT_WS,如果要储存多条记 ...
- ES6学习路上的小学生,promise处理异步操作,简易原始起步之用。先能用,再深究!
ES6的promise对象,让我们更容易的处理这样的需求:执行完一个方法以后,再去执行下一个方法. 理解尚浅之时,先用于项目之中. var promise1 = new Promise(functio ...
- python魔法函数之__getattr__与__getattribute__
getattr 在访问对象的属性不存在时,调用__getattr__,如果没有定义该魔法函数会报错 class Test: def __init__(self, name, age): self.na ...
- iframe内容自适应高度
一直觉得要用JS才能实现iframe高度的自适应,其实CSS也可以,而且实现的更好,只是需要给包裹iframe的DIV设置个高度,然后让irame高度设置成100%就可以自适应了. 完美版Iframe ...
- kali linux DVWA config 问题解决方案
1.下载DVWA之后解压到 var/www/html目录下 unzip DVWA-master.zip -d /usr/www/html 2.配置 打开终端,执行以下命令: 将apache2停止:se ...