Hive内部表、外部表、分区表介绍
2017-07-03 21:39
309 查看
如果在创建表时不指定external关键字,则默认的是创建管理表(内部表),内部表对应的目录必须存储在hive的数据仓库中。
create table trade_detail(id bigint, account string, income double, expenses double, time string) row format delimited fields terminated by
'\t';
还有一种表是指定external关键字的表,即外部表。
如何创建外部表。
create external table td_ext(id bigint, account string, income double, expenses double, time string) row format delimited fields terminated
by '\t' location '/td_ext';
location指定的是hdfs上的目录,该目录表示的是这个外部表目录,这个目录下的文件即为这个表的数据文件。
Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,
不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,
而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
下面再举其它例子说说区别
1.内部表:
hive>create table tt (name string , age string);
//此时会在hdfs的/user/hive/warehouse/目录下新建一个tt表的数据存放地
hive>load data inpath '/input/data' into table tt;
//接着上传hdfs数据到表中,此时会将hdfs上的/input/data目录下的数据转移到/user/hive/warehouse/下,而/input/data目录下的数据就没有了
注意:删除tt表后,会将tt表的数据和元数据信息全部删除,即/user/hive/warehouse/下没有数据。
特别注意:load data会转移数据,也就是/input/data目录下的数据被转移就没有了。
2.外部表:
hive>create external table et (name string , age string);
//在hdfs的/user/hive/warehouse/下面新建一个表目录et
hive>load data inpath '/input/edata' into table et;
//加载hdfs数据,此时会把hdfs上/input/edata/下的数据转到/user/hive/warehouse/et下
删除这个外部表后,/user/hive/warehouse/et下的数据不会被删除,但是/input/edata/下的数据在上一步load后就已经没有了。数据的位置发生变化,本质是load一个hdfs上的数据时会转移数据。
3. 其他:
(1)加上location用法一样,只不过表目录的位置不同而已。
(2)加上partition用法也一样,只不过表目录下会有分区目录而已。
(3)load data local inpath直接把本地文件系统的数据上传到hdfs上,有location上传到location指定的位置上,没有的话上传到hive默认配置的数据仓库中。
分区表:在Hive中,表的每一个分区对应表下的相应目录,所有分区的数据都是存储在对应的目录中。比如lin_test表有start_date分区,则对应start_date=20131218,对应表的目录为/user/hive/warehouse/start_date=20131218/,所有属于这个分区的数据都存放在这个目录中。
为什么有分区表?
如果把一年或者一个月的日志文件存放在一个表下,那么数据量会非常的大,当查询这个表中某一天的日志文件的时候,查询速度还非常的慢,这时候可以采用分区表的方式,把这个表根据时间点再划分为小表。这样划分后,查询某一个时间点的日志文件就会快很多,因为这是不需要进行全表扫描。
hive中的分区表
hive中的分区是根据“分区列”的值对表的数据进行粗略的划分,hive中一个表对应一个目录,再根据分区列在这个表目录下创建子目录,每个子目录名就是分区列的名字。分区列定义与表中字段相似,但是与表中的字段无关,是独立的列。这样就加快了数据查询的速度,因为不会对这个表中进行全盘扫描了。
例子
建分区表
create table book (id bigint, name string) partitioned by (pubdate string) row format delimited fields terminated by '\t';
分区表加载数据
load data local inpath './book.txt' overwrite into table book partition (pubdate='2010-08-22');
查询分区表中数据
select * from book
where pubdate='2010-08-22'
create table trade_detail(id bigint, account string, income double, expenses double, time string) row format delimited fields terminated by
'\t';
还有一种表是指定external关键字的表,即外部表。
如何创建外部表。
create external table td_ext(id bigint, account string, income double, expenses double, time string) row format delimited fields terminated
by '\t' location '/td_ext';
location指定的是hdfs上的目录,该目录表示的是这个外部表目录,这个目录下的文件即为这个表的数据文件。
Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,
不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,
而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
下面再举其它例子说说区别
1.内部表:
hive>create table tt (name string , age string);
//此时会在hdfs的/user/hive/warehouse/目录下新建一个tt表的数据存放地
hive>load data inpath '/input/data' into table tt;
//接着上传hdfs数据到表中,此时会将hdfs上的/input/data目录下的数据转移到/user/hive/warehouse/下,而/input/data目录下的数据就没有了
注意:删除tt表后,会将tt表的数据和元数据信息全部删除,即/user/hive/warehouse/下没有数据。
特别注意:load data会转移数据,也就是/input/data目录下的数据被转移就没有了。
2.外部表:
hive>create external table et (name string , age string);
//在hdfs的/user/hive/warehouse/下面新建一个表目录et
hive>load data inpath '/input/edata' into table et;
//加载hdfs数据,此时会把hdfs上/input/edata/下的数据转到/user/hive/warehouse/et下
删除这个外部表后,/user/hive/warehouse/et下的数据不会被删除,但是/input/edata/下的数据在上一步load后就已经没有了。数据的位置发生变化,本质是load一个hdfs上的数据时会转移数据。
3. 其他:
(1)加上location用法一样,只不过表目录的位置不同而已。
(2)加上partition用法也一样,只不过表目录下会有分区目录而已。
(3)load data local inpath直接把本地文件系统的数据上传到hdfs上,有location上传到location指定的位置上,没有的话上传到hive默认配置的数据仓库中。
分区表:在Hive中,表的每一个分区对应表下的相应目录,所有分区的数据都是存储在对应的目录中。比如lin_test表有start_date分区,则对应start_date=20131218,对应表的目录为/user/hive/warehouse/start_date=20131218/,所有属于这个分区的数据都存放在这个目录中。
为什么有分区表?
如果把一年或者一个月的日志文件存放在一个表下,那么数据量会非常的大,当查询这个表中某一天的日志文件的时候,查询速度还非常的慢,这时候可以采用分区表的方式,把这个表根据时间点再划分为小表。这样划分后,查询某一个时间点的日志文件就会快很多,因为这是不需要进行全表扫描。
hive中的分区表
hive中的分区是根据“分区列”的值对表的数据进行粗略的划分,hive中一个表对应一个目录,再根据分区列在这个表目录下创建子目录,每个子目录名就是分区列的名字。分区列定义与表中字段相似,但是与表中的字段无关,是独立的列。这样就加快了数据查询的速度,因为不会对这个表中进行全盘扫描了。
例子
建分区表
create table book (id bigint, name string) partitioned by (pubdate string) row format delimited fields terminated by '\t';
分区表加载数据
load data local inpath './book.txt' overwrite into table book partition (pubdate='2010-08-22');
查询分区表中数据
select * from book
where pubdate='2010-08-22'
相关文章推荐
- 一起学Hive——创建内部表、外部表、分区表和分桶表及导入数据
- Hive内部表、外部表、分区表以及外部分区表创建以及导入数据实例讲解
- Hive学习笔记 3 Hive的数据模型:内部表、分区表、外部表、桶表、视图
- Hive的表的创建及外部表、分区表介绍
- Hadoop学习笔记(十八)---Hive内部表,外部表,分区表,桶表
- hive内部表与外部表区别详细介绍
- Hive中管理表(内部表)和外部表的区别是什么,及分区表使用场景
- hive内部表与外部表区别详细介绍
- hive内部表、外部表、分区表、视图
- Hive关于内部表外部表以及分区表数据删除总结
- hive中的内部表、外部表、分区表
- hive内部表与外部表区别详细介绍
- hive内部表与外部表区别详细介绍
- Hive数据加载(内部表,外部表,分区表)
- hive内部表与外部表区别详细介绍
- hive内部表与外部表区别详细介绍
- Hive笔记三之内部表,外部表,分区表,桶表
- Hive内部表与外部表区别详细介绍
- hive内部表,外部表,分区表,桶表,函数及自定义函数
- Hive内部表,外部表,分区表的创建