Hive的分区、分桶、索引
在开始阅读之前让我们喊出口号:“要想人前显贵,就要人后受罪!”加油嘎嘣儿,加油所有想获得美好未来的你!
一、分区
MR的分区:是将数据按照一定的逻辑进行查分,划分为不同的区域,这个区域的数据将会给指定的reduce。
Hive的分区:对表划分成几个区域,通过分类把不同类型的数据放到不同的目录下。
分区表与普通表相比它的优势和劣势
优势:和普通表相比,当按照分区条件进行过滤的时候分区表会比普通表查询的效率高很多,因为和普通表相比它会减少笛卡尔积,不用进行全表扫描。
劣势:理论上来讲分区的数量越多查询时的效率就会越高,但是分区量的增加会引起元数据的增加导致NameNode压力越大,因此一定不能无限制的产生分区。
1.静态分区 :机械的指定分区的条件
eg: create table tableName(col colType..) partitioned by (col Type) row format delimited fields termined by " ";
2.多个分区:一个表中存在多个字段分区(注意:分区的父子关系不能写错)
eg: create table t_p1(id int,day int,temp double) partitioned by (year int,month int) row format delimited fields terminated by " ";
3.动态分区:当指定一个或者多个分区字段,那么再插入数据的时候就可以按照字段的值进行自动分区,实现动态识别。(注意:往动态分区表中添加数据不能用load,因为没法区分字段的类型,需要用Insert但是对于大量的数据来讲Insert是不合适的所以推荐创建一个临时表,通过Load将数据方法到临时表中,再从临时表中查询数据,得出结果再放到分区表中)
4.混合分区 :为了应对当数据量特别大的时候,如果使用动态分区会产生大量的元数据,导致NameNode 的压力变大,进行混合分区,但必须保证多个分区字段的首个字段一定是静态字段。
二、分桶
分桶就是在分区的基础上进行二次划分,又将数据切分成桶即将在这个分区中的数据按照某一列的hashcode与桶的数量进行取余,得出的就是桶的编号。
eg:create table t_cluster(id int ,day int,tmp double ) partitioned by (month int) clustered by (id) into 3 buckets;
优势:就是将两个标的数据都按照关联的那个列进行分桶,以后两个表的数据进行关联的时候,就直接在对应的通上进行关联,增加查询效率并大量的减少笛卡尔积。
劣势:和分区一样,都会增加NameNode 的压力。
三、索引
以上谈论的分区和分桶都是只能优化查询到某个群体,不能具体到的那个数据,为了实现查询到的那个数据的优化,就产生了索引,对hive中的数据,会产生一个新文件,这个文件会记录每个数据的位置。
eg:create index index_name on table tablename(col) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
with deferred rebuild;