-
内部表:创建表的时候默认把该表的数据,使用默认的组织方式,来存储在默认的仓库路径
create table student()
-
外部表:创建表的时候,数据已经在hdfs了,不是默认目录,需要在创建表的时候指定目录。适合多个team共同访问的数据
create external table student( ) row ...loaction "/aa/bb/cc"
删除表的时候
内部表:删除元数据也删除数据文件
外部表:删除元数据,不删除数据文件
-
分区表:表中数据一定属于某个分区
create table student_par(id int,name string )partitioned by (age int)
分区字段一定不能和表字段一样,但是在使用的时候,分区字段和表字段没有不同
以前数据直接放在表目录中,现在表目录中再创建文件夹,每个文件夹保存一部分数据,也就意味着:一张表的数据可以被分门别类的进行管理
hdfs:/user/hive/warehouse/db.db/student/city=shanghai/student/.txt
生产环境中绝大部分的表都是分区表,分区字段大部分都是date类型,按天分区概率最大
select * from student_par where date > 2020-08-21
-
分桶表:按照文件的形式来组织区分和默认的mapreduce的hashpartioner一模一样
create table student_bck(id int,name string) cluster by (name) sorted by (age desc) into 3 buckets;
这张表中的数据,按照name字段划分成了三个文件进行管理,每个文件中的数据都会按照age进行降序排列
hash散列,分成三个桶
分区表用来提高查询效率,如果大量的sql语句都是按照某个字段进行过滤,那么可以按照这个字段作为分区字段建表
如果数据基本上只会分析增量数据,不会分析全量数据。那么就应该按照时间进行分区
分桶表也是用来提高查询效率,用来进行抽样
如果某张表的某个字段经常被用作一个join查询条件,就应该要建分桶表进行优化
select a.*,b.* from a join b on a.id=b.id a表和b表都要分桶,而且字段要一致,只要两个表的分桶个数是倍数关系就可以
为什么分桶join会比较快?上图
分区分桶都会产生数据倾斜
数据仓库的默认路径:/user/hive/warehouse
库路径:db1.db
表路径:student
数据文件:student.txt
当前表的完成的存储路径:/user/hive/warehouse/db1.db/student/student.txt