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分桶的方式分桶存放,而所谓的桶就是表文件夹下不同的文件
使用场景:
对于一个庞大的数据集我们经常需要拿出来一小部分作为样例,然后在样例上验证我们的查询,优化我们的程序,利用分桶表可以实现数据的抽样