Hive的分区和分桶

Posted 蓝小冰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive的分区和分桶相关的知识,希望对你有一定的参考价值。

# 建立分区表的目的:

查询的时候到对应的文件中进行查询,避免扫描全表!达到加快查询的目的!

例如:按照时间进行分区:查询某天的数据只需要在查询的条件中加入要查询的天数就会到对应的文件中进行查询!不会对整个表进行扫描

# Hive的分区表

Hive建立分区表会在对应的目录下生成相应的子目录,当查询时添加分区条件,则会扫描对应分区中的内容,避免扫描全表,从而加快达到加快查询的目的。

创建分区表的步骤:

1. 设置开启动态分区

    hive.exec.dynamic.partition=true;

2. 动态分区模式
            hive.exec.dynamic.partition.mode=nonstrict

3. 设置最大动态分区数
            hive.exec.max.dynamic.partitions.pernode=1000(这个可以更改)

# 创表的时候就建立分区表
    create external table sogou.sogou_uid_pid(
        uid string,
        keyword string,
        rank int,
        ord int
    )partition by(
        year int,
        month int,
        day int    
    )
    row format delimited
    fields terminated by '\t'
    stored as textfile
    location '/sogou/sou_uid_pid'

# 对已经存在的表修改为分区表

alter table sogou.sogou_uid_pid partition(year=2015,month=10,day=3) set location '/sogou/sogou_2015'

# Hive分区过多有何坏处以及分区是的注意事项

1.当分区过多且数据很大时,可以使用严格模式,避免触发一个很大的MapReduce任务,当分区数量过多且数据量较大时,执行一个宽范围的数据扫描会触发一个很大的MapReduce任务。在严格模式下,当where中没有分区过滤条件时会禁止执行。

2.Hive如果有过多的分区,由于底层存储依赖于HDFS,HDFS适合存储大文件而非小文件,因此分区过多会增加NameNode的负担。

3.HQL会转化成MapReduce,MapReduce会转换成多个task,过多小文件的话,每个文件一个task,每个task一个JVM,JVM的开启和销毁会降低系统效率。

注意:合理的分区不应该有过多的分区和文件目录,并且每个目录下的文件应该足够大。

# Hive的分桶

分桶是更细粒度的数据范围划分。Hive的分桶是针对列,对列值进行hash,与分桶数取模来决定改记录放在哪个桶里。

分桶的理由:

1.获取更高的查询处理效率。若两个表对相同的字段建立了分桶操作,则列个表在进行join的时候,就会大大的减少join的数据量。

2.取样的效率更高。在开发测试阶段,对于大规模数据集,可以进行采样查询,会带来很多方便。

3.桶的数量是固定的,没有数据波动。

以上是关于Hive的分区和分桶的主要内容,如果未能解决你的问题,请参考以下文章

Hive里的分区和分桶再谈

Hive:第 7 章 分区表和分桶表

Hive的分区和分桶

分区和分桶区别

在 Hive 中对表进行分区和分桶有啥区别?

hive的分区和分桶