Hive的DDL–分桶表
分桶表(cluster by into num buckets)
指定开启分桶
hive (xiaoliu)> set hive.enforce.bucketing;
hive.enforce.bucketing is undefined
hive (xiaoliu)> set hive.enforce.bucketing=true;
hive (xiaoliu)> set mapreduce.job.reduces=4;
hive (xiaoliu)> set mapreduce.job.reduces;
mapreduce.job.reduces=4
hive (xiaoliu)> set hive.enforce.bucketing;
hive.enforce.bucketing=true
分桶表 创建之前 需要开启分桶功能
分桶表(分簇表)创建的时候 分桶字段必须是表中已经存在的字段,也就是说,要按照表中的字段进行分开
hive (xiaoliu)> create table stu_buck(Sno int,Sname string,Sex string,Sage int,Sdept string)
> clustered by(Sno) #根据Sno进行分桶
> into 4 buckets #分到4个桶中
> row format delimited
> fields terminated by ','
hive (xiaoliu)> select * from stu_buck;
OK
stu_buck.sno stu_buck.sname stu_buck.sex stu_buck.sage stu_buck.sdept
Time taken: 0.161 seconds
创建数据文档
[xiaokang@hadoop hive_data]$ vi students.txt
95001,李勇,男,20,CS
95002,刘晨,女,19,IS
95003,王敏,女,22,MA
95004,张立,男,19,IS
95005,刘刚,男,18,MA
95006,孙庆,男,23,CS
95007,易思玲,女,19,MA
95008,李娜,女,18,CS
95009,梦圆圆,女,18,MA
95010,孔小涛,男,19,CS
95011,包小柏,男,18,MA
95012,孙花,女,20,CS
95013,冯伟,男,21,CS
95014,王小丽,女,19,CS
95015,王君,男,18,MA
95016,钱国,男,21,MA
95017,王风娟,女,18,IS
95018,王一,女,19,IS
95019,邢小丽,女,19,IS
95020,赵钱,男,21,IS
95021,周二,男,17,MA
95022,郑明,男,20,MA
错误方式:
hive (xiaoliu)> load data local inpath '/home/xiaokang/hive_data/students.txt' into table stu_buck;
hive (xiaoliu)> select * from stu_buck;
OK
stu_buck.sno stu_buck.sname stu_buck.sex stu_buck.sage stu_buck.sdept
NULL NULL NULL NULL NULL
95020 赵钱 男 21 IS
95016 钱国 男 21 MA
95012 孙花 女 20 CS
95008 李娜 女 18 CS
95004 张立 男 19 IS
95017 王风娟 女 18 IS
95001 李勇 男 20 CS
95013 冯伟 男 21 CS
95009 梦圆圆 女 18 MA
95021 周二 男 17 MA
95005 刘刚 男 18 MA
95010 孔小涛 男 19 CS
95018 王一 女 19 IS
95002 刘晨 女 19 IS
95006 孙庆 男 23 CS
95022 郑明 男 20 MA
95014 王小丽 女 19 CS
95011 包小柏 男 18 MA
95007 易思玲 女 19 MA
95015 王君 男 18 MA
95019 邢小丽 女 19 IS
95003 王敏 女 22 MA
注意:
hive不支持load data方式导成分桶表的数据,没有分桶效果,原因在于load 本质上相当于hive去帮我们执行hadoop fs -put
正确方式:
向一张表中插入数据,插入的数据来自另一张表,即分桶表的数据采用insert+select,底层执行了mr程序。
#新建一张临时表student
hive (xiaoliu)> create table student(Sno int,Sname string,Sex string,Sage int,Sdept string)
> row format delimited
> fields terminated by ',';
hive (xiaoliu)> load data local inpath '/home/xiaokang/hive_data/students.txt' into table student;
hive (xiaoliu)> select * from student;
OK
student.sno student.sname student.sex student.sage student.sdept
95001 李勇 男 20 CS
95002 刘晨 女 19 IS
95003 王敏 女 22 MA
95004 张立 男 19 IS
95005 刘刚 男 18 MA
95006 孙庆 男 23 CS
95007 易思玲 女 19 MA
95008 李娜 女 18 CS
95009 梦圆圆 女 18 MA
95010 孔小涛 男 19 CS
95011 包小柏 男 18 MA
95012 孙花 女 20 CS
95013 冯伟 男 21 CS
95014 王小丽 女 19 CS
95015 王君 男 18 MA
95016 钱国 男 21 MA
95017 王风娟 女 18 IS
95018 王一 女 19 IS
95019 邢小丽 女 19 IS
95020 赵钱 男 21 IS
95021 周二 男 17 MA
95022 郑明 男 20 MA
NULL NULL NULL NULL NULL
# 底层执行mr程序
hive (xiaoliu)> insert overwrite table stu_buck
> select * from student cluster by(sno);
hive (xiaoliu)> select * from stu_buck;
OK
stu_buck.sno stu_buck.sname stu_buck.sex stu_buck.sage stu_buck.sdept
NULL NULL NULL NULL NULL
95004 张立 男 19 IS
95008 李娜 女 18 CS
95012 孙花 女 20 CS
95016 钱国 男 21 MA
95020 赵钱 男 21 IS
95001 李勇 男 20 CS
95005 刘刚 男 18 MA
95009 梦圆圆 女 18 MA
95013 冯伟 男 21 CS
95017 王风娟 女 18 IS
95021 周二 男 17 MA
95002 刘晨 女 19 IS
95006 孙庆 男 23 CS
95010 孔小涛 男 19 CS
95014 王小丽 女 19 CS
95018 王一 女 19 IS
95022 郑明 男 20 MA
95003 王敏 女 22 MA
95007 易思玲 女 19 MA
95011 包小柏 男 18 MA
95015 王君 男 18 MA
95019 邢小丽 女 19 IS
分桶表也是把表所映射的结构化数据文件分成更加细致的部分,但是更多的是用在join查询提高效率上,只需要把join字段在各自表当中进行分桶操作即可。