Hive四种表类型

4种表类型

Hive的表就是在HDFS上新建了一个目录,并制定了数据文件的分隔符,目录下的文件即是数据来源,文件中的分隔符必须与创建表的分隔符一致

Hive有内部表、外部表、分区表、分桶表4种类型以满足不同的业务场景,简化使用方式,提高生产速度。

内部表

说明:先使用命令创建表,然后在加载文件数据到表中

命令:

create table table_name (column_name type,[column_name type]...) row format delimited fields terminated by '\t';

load data local inpath 'file_path' into table table_name;

使用场景:

在新系统建设初期,对需求明确,先有表,系统上线,数据入表

其他:

删除内部表时会将表的数据一并删除

drop table table_name;

可以直接使用相关工具往表对应的HDFS文件目录下上传文件,Hive即可查询出来

外部表

说明:数据文件已经存在,然后使用命令创建表并指定表的数据文件路径

命令:

create external table (column_name type,[column_name type]...) table_name row format delimited fields terminated by '\t' location 'file_path';

使用场景:

系统已经上线,新需求来了,现有的表无法支撑新需求,因此需要新建一张表

其他:

删除外部表时不会删除它关联的数据文件

drop table table_name;

分区表

说明:

根据业务编码、日期、其他类型等维度创建分区表,比如一个重庆市的9个区域各自一个分区,如果要查某一个区域的数据,只需要访问一个分区的数据,而不需要从全量数据中进行筛选。

分区底层实现逻辑为:

在一个表对应的目录下,一个分区对应一个目录

命令:

create table table_name (column_name type,[column_name type]...) partitioned by (column_name type) row format delimited ternimated by '\t';

select * from table_name where partition_column_name = value;

使用场景:

单表数据量巨大,而且查询又经常限定某一个类别,那么可以将表按照该类别进行分区,以提高数据查询效率,减少资源开销

其他:

直接在HDFS里面创建分区目录,HIVE是无法识别的,因为MySQL中元数据不包含此分区

分桶表

说明:

将大表进行哈希散列抽样存储,方便做数据和代码验证。比如将表分成10分,每次只拿其中的十分之一来使用,可以快速的得到结果

分桶底层实现逻辑:

在表对应的目录下,将源文件拆分成N个小文件

命令:

开启分桶功能,强制多个 reduce 进行输出:

set hive.enforce.bucketing=true;

准备主表:

create table teacher(id int,name string) row format delimited fields terminated by '|';

向主表加载数据:

load data local inpath '/root/work/teachers.txt' into table teacher;

创建带桶的 table :

create table teacher_temp(id int,name string) clustered by (id) into 2 buckets row format delimited fields terminated by '|';

从主表向分桶表导入数据:

insert overwrite/into table teacher_temp select * from tacher; 分桶表其实就是将表中的数据按照hash分桶的方式分桶存放,而所谓的桶就是表文件夹下不同的文件

使用场景:

对于一个庞大的数据集我们经常需要拿出来一小部分作为样例,然后在样例上验证我们的查询,优化我们的程序,利用分桶表可以实现数据的抽样

 

 

猜你喜欢

转载自my.oschina.net/u/3049601/blog/1816496