Hive分桶

分桶:把上传数据,分为不同的文件
    将同一个目录下的数据文件,拆分成多个
    同一目录多个文件
    加快表连接的速度(join)
应用场景:数据抽样(sampling)、map-join

其他情况不建议分桶,小文件很恐怖!
资源调度和分配————最消耗时间

Hive分桶

  1. 分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储。
  2. 对于hive中每一个分区都可以进一步进行分桶。
  3. 列的哈希值/桶的个数来决定每条数据划分在哪个桶中。

开启支持分桶

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

《Hive分桶》 分桶数据
《Hive分桶》

参考资料

Hadoop集群上搭建Hive
Hive建表并加载数据
Hive参数和动态分区

    原文作者:geekAppke
    原文地址: https://www.jianshu.com/p/807f8b309d4e
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞