Hive分区和分桶

分区的目的是缩小搜索范围,加快查询速度;
分区是针对表进行的,一个表可以从多个维度进行分区,比如按照日期进行分区;
分区是创建表时通过PARTITIONED BY子句定义的,如:

CREATE TABLE employee(eid int,name string,salary string,destination string) 
> PARTITIONED BY (dt string, country string)    //添加分区,可选项

分桶是相对分区进行更细粒度的划分。分桶将整个数据内容按照某列属性值的hash值进行区分,如按照name字段分为3个桶,就是对name字段数据的hash值对3取模,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。
分桶之前要执行命令:

hive> set hive.enforce.bucketing=true;
hive> set mapreduce.job.reduces=3;        //reduces数量应该与分桶数保持一致

使用关键字clustered by 指定分桶依据的列名,还要指定分为多少桶;

> CREATE TABLE employee(eid int,name string,salary string,destination string) 
> clustered by(eid) into 3 buckets          //针对eid字段分3个桶

分区依据的不是真实数据表文件中的列,而是我们指定的伪列,但是分桶是依据数据表中真实的列而不是伪列。 所以在指定分区依据的列的时候要指定列的类型,因为在数据表文件中不存在这个列,相当于新建一个列。而分桶依据的是表中已经存在的列,这个列的数据类型显然是已知的,所以不需要指定列的类型。
注意:创建表时进行分桶设置,load方式加载数据到数据表时,并不能实现分桶效果,完整的分桶操作如下:

(1)创建普通表:
CREATE TABLE employee(eid int,name string,salary string,destination string) 
>ROW FORMAT DELIMITED 
> FIELDS TERMINATED BY ','
(2)加载数据:
LOAD DATA LOCAL INPATH '/home/hadoop/hive-test/sample.txt'
> [OVERWRITE] INTO TABLE db_hive.employee
(3)创建分桶表:
CREATE TABLE employee_buck(eid int,name string,salary string,destination string) 
> clustered by(eid) into 3 buckets          //针对eid字段分3个桶
>ROW FORMAT DELIMITED 
> FIELDS TERMINATED BY ','
(4) 要开启模式开关
> set hive.enforce.bucketing = true;
> set mapreduce.job.reduces=3;
(5)数据分桶:
> INSERT INTO table employee_buck
> SELECT * FROM employee  cluster by(eid);
或者:
可以使用distribute by(sno) sort by(sno asc)   ,等价于排序和分桶的字段相同的时候使用Cluster by(字段)
> INSERT INTO table employee_buck
> select * from employee distribute by(eid) sort by(eid asc);

把表(或者分区)组织成桶(Bucket)有两个理由:
(1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大减少JOIN的数据量。例如:

select a.id,a.name,b.addr from a join b on a.id = b.id;

如果a表和b表已经是分桶表,而且分桶的字段是id字段,那么做这个操作的时候就不需要再进行全表笛卡尔积了。但是如果标注了分桶但是实际上数据并没有分桶,那么结果就会出问题。
(2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

猜你喜欢

转载自blog.csdn.net/weixin_41907511/article/details/84783108
今日推荐