Hive桶

Hive桶

Hive 桶
对于每一个表(table)或者分区,Hive可以进一步组织成桶。Hive也是针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。采用桶能够带来一些好处,比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。
1. 创建带桶的 table :

create table bucketed_user(id int,name string) clustered by (id) sorted by(name) into 4 buckets row format delimited fields terminated by '\t' stored as textfile;  

2. 强制多个 reduce 进行输出:

set hive.enforce.bucketing=true;

3. 往表中插入数据:

insert overwrite table bucketed_user select * from test;  

4. 查看表的结构,会发现当前表下有四个文件:

dfs -ls /home/hadoop/hive/warehouse/bucketed_user; 

5. 读取数据,看没一个文件的数据:

dfs -cat /home/hadoop/hive/warehouse/bucketed_user/000000_0;

桶使用 hash 来实现,所以每个文件拥有的数据的个数都有可能不相等。
6. 对桶中的数据进行采样:

select * from bucketed_user tablesample(bucket 1 out of 4 on name);

桶的个数从 1 开始计数,前面的查询从 4 个桶中的第一个桶获取数据。其实就是四分之一。
7. 查询一半返回的桶数:

select * from bucketed_user tablesample(bucket 1 out of 2 on name);