参考

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

原作者:
添加链接描述

准备数据

/root/soft/buckt_data.txt

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

创建普通的表

  1. create table test
  2. (
  3. id int comment 'ID',
  4. name string comment '名字'
  5. )
  6. comment '测试分桶中间表'
  7. ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

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

查看

  1. select *
  2. from test;

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

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

再看一下test临时表

  1. select *
  2. from test;

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

创建排序的分桶表

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

sql

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

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

sql

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

默认是false,需要配置成true

下面SQL依次执行一遍

sql:

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

从临时表里面导入数据

上面已经执行了
sql:

  1. select *
  2. from test;

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

hive分桶表排序 - 图2

开始导入数据,
sql:

  1. insert into test_bucket_sorted
  2. select *
  3. from test;

查看导入的结果

sql:

  1. select *
  2. from test_bucket_sorted;

hive分桶表排序 - 图3

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

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

登录hdfs
可以看到已经分了四个桶
hive分桶表排序 - 图4
依次打开这四个文件

shell:

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

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