Hive的表就是在HDFS上新建了一个目录,并制定了数据文件的分隔符,目录下的文件便是数据来源,文件中的分隔符必须与建立表的分隔符一致工具
Hive有内部表、外部表、分区表、分桶表4种类型以知足不一样的业务场景,简化使用方式,提升生产速度。优化
说明:先使用命令建立表,而后在加载文件数据到表中编码
命令:spa
create table table_name (column_name type,[column_name type]...) row format delimited fields terminated by '\t';orm
load data local inpath 'file_path' into table table_name;资源
使用场景:string
在新系统建设初期,对需求明确,先有表,系统上线,数据入表hash
其余:it
删除内部表时会将表的数据一并删除io
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分桶的方式分桶存放,而所谓的桶就是表文件夹下不一样的文件
使用场景:
对于一个庞大的数据集咱们常常须要拿出来一小部分做为样例,而后在样例上验证咱们的查询,优化咱们的程序,利用分桶表能够实现数据的抽样