Hive分桶表学习总结

前言

学习总结一下Hive的分桶表。

  • 分桶规则:对分桶字段值进行哈希,哈希值除以桶的个数求余,余数决定了该条记录在哪个桶中,也就是余数相同的在一个桶中。
  • 优点:1、方便抽样 2、提高join查询效率

1、建表

通过 clustered by(字段名) into bucket_num buckets 分桶,意思是根据字段名分成bucket_num个桶

create table test_bucket (
id int comment 'ID', 
name string comment '名字'
)
comment '测试分桶'
clustered by(id) into 4 buckets
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

2、插入数据

2.1 数据

buckt_data.txt

1,name1
2,name2
3,name3
4,name4
5,name5
6,name6
7,name7
8,name8
9,name9

2.2 load data

直接load data不会有分桶的效果,这样和不分桶一样,在HDFS上只有一个文件。

load data local inpath '/root/dkl/data/buckt_data.txt' into table test_bucket;

需要借助中间表

create table test (
id int comment 'ID', 
name string comment '名字'
)
comment '测试分桶中间表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

先将数据load到中间表

load data local inpath '/root/dkl/data/buckt_data.txt' into table test;

然后通过下面的语句,将中间表的数据插入到分桶表中,这样会产生四个文件。

insert into test_bucket select * from test;

2.3 结果

HDFS:桶是以文件的形式存在的,而不是像分区那样以文件夹的形式存在。

看一下每个文件下存放的都是什么数据

可以看到除以4余数相同的确实在一个文件里,也就是在一个桶中。

我们用sql语句查出来的顺序和文件存放的顺序是一致的。

2.4 再次插入数据

这样会再产生新的四个文件

3、分桶排序

上面建的表每个桶内的数据是没有排序的,可以将上面的数据打乱,先看一下

buckt_data.txt

5,name5
2,name2
7,name7
3,name3
8,name8
4,name4
6,name6
1,name1
9,name9

删除表数据

truncate table test_bucket;
truncate table test;

重新按上面讲的,导入打乱的数据。

load data local inpath '/root/dkl/data/buckt_data.txt' into table test;
insert into test_bucket select * from test;

确实没有排序(默认按文件里的顺序)

下面按id升序排序

3.1 建表

create table test_bucket_sorted (
id int comment 'ID', 
name string comment '名字'
)
comment '测试分桶'
clustered by(id) sorted by (id) into 4 buckets
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

3.2 插入数据

insert into test_bucket_sorted select * from test;

3.3 查看结果

用sql看和用hadoop命令看每个文件,结果每个桶内都是按id升序排序的,也就是和最开始的截图是一样的。

3.4 好处

因为每个桶内的数据是排序的,这样每个桶进行连接时就变成了高效的归并排序

参考:https://blog.csdn.net/zhihaoma/article/details/52539986

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券