参考

我是照着这个作者的文章学习, 并且自己又总结了一下, 毕竟本人能力有限,不可能完全照着官方文档去自己研究 = =所以很多东西都是把别人的知识偷过来,自己再练习一下总结一下,占为己有,就变成自己的东西了…

准备数据

/root/soft/buckt_data.txt

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

创建普通的表

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

用来导数据用, 因为要想往分区表里面导入数据必须要经过MapReduce程序

查看

select *
from test;

现在是空的
往空的test临时表里面导数据

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

再看一下test临时表

select *
from test;

hive分桶表排序_数据
有了,但是数据是乱的.

创建排序的分桶表

每个分区筒里面根据id升序

sql

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 ',';

查看是否开启了分桶和排序

sql

set hive.enforce.bucketing ;  -- 查看分桶配置
set hive.enforce.sorting ; -- 查看排序配置

默认是false,需要配置成true

下面SQL依次执行一遍

sql:

set hive.enforce.bucketing=true; --开启强制分桶,默认是不会帮你分桶的
set hive.enforce.sorting=true; -- 开启强制排序,默认是不会帮你排序的.

从临时表里面导入数据

上面已经执行了
sql:

select *
from test;

看到test这个临时表数据是乱序的

hive分桶表排序_hive_02

开始导入数据,
sql:

insert into test_bucket_sorted
select *
from test;

查看导入的结果

sql:

select *
from test_bucket_sorted;

hive分桶表排序_数据_03

看到这里别着急,最初我也是以为分桶表排序后查询的顺序也是一致的,其实结论不是这样的, 因为你分桶表是给数据分到多个地方,多个地方里面每一个桶里面才是根据某个字段排序的,并不是查询出来的就是语句就是排序的, 这点我在初学的时候我犯过这个错误…

验证是否根据id进行排序了

登录hdfs
可以看到已经分了四个桶
hive分桶表排序_数据_04
依次打开这四个文件

shell:

[root@zjj101 ~]# hadoop fs -cat /user/hive/warehouse/test_bucket_sorted/000000_0
4,name4
8,name8
[root@zjj101 ~]# hadoop fs -cat /user/hive/warehouse/test_bucket_sorted/000001_0
1,name1
5,name5
9,name9
[root@zjj101 ~]# hadoop fs -cat /user/hive/warehouse/test_bucket_sorted/000002_0
2,name2
6,name6
[root@zjj101 ~]# hadoop fs -cat /user/hive/warehouse/test_bucket_sorted/000003_0
3,name3
7,name7
[root@zjj101 ~]#

可以看到这四个文件里面每个都是根据第一个字段进行排序的, 也就是根据id排序的. 这才是分桶表排序的地方, 并不是说我执行了select * from test_bucket_sorted; 看到的结果没排序我就认为排序失败了…这是我初学时候犯过的错误.
下面再仔细对比一下.
下面执行完了select * from test_bucket_sorted; 给四个桶的数据都打出来了,顺序和上面 481592637 顺序是一样的.
hive分桶表排序_sql_05