分桶:把上传数据,分为不同的文件
将同一个目录下的数据文件,拆分成多个
同一目录多个文件
加快表连接的速度(join)
应用场景:数据抽样(sampling)、map-join
其他情况不建议分桶,小文件很恐怖!
资源调度和分配————最消耗时间
Hive分桶
- 分桶表是对列值
取哈希值
的方式,将不同数据
放到不同文件
中存储。 - 对于hive中每一个
表
、分区
都可以进一步进行分桶。 - 由
列的哈希值
/桶的个数
来决定每条数据划分在哪个桶中。
开启支持分桶
set hive.enforce.bucketing=true;
默认:false
;设置为true
之后,mr运行时会根据bucket的个数
自动分配reduce task
个数。(用户也可以通过mapred.reduce.tasks
自己设置reduce任务个数
,但分桶时不推荐使用)
注意:一次作业产生的桶(文件数量)和reduce task
个数一致。
往分桶表中加载数据
insert into table bucket_table select columns from tbl;
insert overwrite table bucket_table select columns from tbl;
桶表抽样查询
hive> select * from bucket_table tablesample(bucket 1 out of 4 on columns);
TABLESAMPLE语法:
TABLESAMPLE(BUCKET x OUT OF y)
x:表示从哪个桶开始,抽取数据
y:必须为该表总bucket桶的倍数或因子
当表总bucket数为32时
(1)TABLESAMPLE(BUCKET 3 OUT OF 8),抽取哪些数据?
32 / 89 = 4抽4个桶
从3开始,11,19,27 这4个桶的数据
(2)TABLESAMPLE(BUCKET 3 OUT OF 256),抽取哪些数据?
抽取 32 / 256 = 1/8 ,从第3个桶取1/8的数据
不管是倍数还是因子,桶的个数 / y = 需要的值
建原始表
hive> create table psn31(id int, name string, age int)
row format delimited fields terminated by ',';
hive> load data local inpath '/root/psn31.data' into table psn21;
创建分桶表
给定指定列
hive> create table psnbucket(id int, name string, age int)
clustered by (age) into 4 buckets
row format delimited fields terminated by ',';
加载数据:
hive> insert into table psnbucket select id, name, age from psn31;
执行map-reduce
抽样
hive> select id, name, age from psnbucket tablesample(bucket 2 out of 4 on age);
id name age
7 alice 77
3 dog 33
测试数据
原始数据 | 分桶顺序 | 分桶号 |
---|---|---|
1,tom,11 2,cat,22 3,dog,33 4,hive,44 5,hbase,55 6,mr,66 7,alice,77 8,scala,88 |
3 2 1 0 3 2 1 0 |
8,scala,88 4,hive,44 7,alice,77 3,dog,33 6,mr,66 2,cat,22 5,hbase,55 1,tom,11 |
网友评论