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
分桶数据

参考资料

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容