您的位置:首页 > 其它

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'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: