分桶表

分桶和分区一样,也是将数据拆分和分离的一种方式,不同点时,分区是通过目录的方式进行数据拆分。
而分桶是将数据文件进行拆分和隔离的一种方式,不同的桶的数据分布在同一个目录,不同文件

注意,分区是通过外部字段进行分区,而分桶是根据表中的内在属性进行分桶。

使用分桶表

  1. 创建分桶表
1
2
3
4
5
6
7
8
create table user_bucket(id int,name string)

clustered by (id)

into 4 buckets

row format delimited fields terminated by ',';

根据id 进行分表,并且分到4个桶里。

  1. 插入数据
1
2
3
4
5

insert into user_bucket(id,name) values (1,'name1');
insert into user_bucket(id,name) values (2,'name2');
insert into user_bucket(id,name) values (3,'name3');

  1. 查看数据

+—————–+——————-+
| user_bucket.id | user_bucket.name |
+—————–+——————-+
| 2 | name2 |
| 1 | name1 |
| 3 | name3 |
+—————–+——————-+

可以看到数据分散到不同的桶中;并在在目录下由多个文件来存储。

分桶的时候 是将对应的值先进行hash ,然后再对桶的个数进行取模来决定放到那个桶中。

分桶计算的输出结果,每个桶对应到 MapReduce 中的一个Reduce job。 hive中的分桶和MR 中的分区是可以看做同一个处理过程。一个hive的几个分桶,在mr执行的时候就执行几个分区。

为了尽量的利用reduce job的并行处理,因为不同的桶是由不同的job处理的,所以 reduce job 的个数不要指定,让它自定决定。