转自:
测试数据
95001,李勇,男,20,CS95002,刘晨,女,19,IS95003,王敏,女,22,MA95004,张立,男,19,IS95005,刘刚,男,18,MA95006,孙庆,男,23,CS95007,易思玲,女,19,MA95008,李娜,女,18,CS95009,梦圆圆,女,18,MA95010,孔小涛,男,19,CS95011,包小柏,男,18,MA95012,孙花,女,20,CS95013,冯伟,男,21,CS95014,王小丽,女,19,CS95015,王君,男,18,MA95016,钱国,男,21,MA95017,王风娟,女,18,IS95018,王一,女,19,IS95019,邢小丽,女,19,IS95020,赵钱,男,21,IS95021,周二,男,17,MA95022,郑明,男,20,MA
创建分桶表
drop table stu_buck;create table stu_buck(Sno int,Sname string,Sex string,Sage int,Sdept string)clustered by(Sno) //根据Sno分桶sorted by(Sno DESC)into 4 bucketsrow format delimitedfields terminated by ',';
设置变量,设置分桶为true, 设置reduce数量是分桶的数量个数
set hive.enforce.bucketing = true;set mapreduce.job.reduces=4;
加载数据
load data local inpath '/mnt/hgfs/share_folder/hiveDATA/students.txt' into table stu_buck;Loading data to table default.stu_buckTable default.stu_buck stats: [numFiles=1, totalSize=526]
检查刚刚加载的数据
select * from stu_buck;OK95001 李勇 男 20 CS95002 刘晨 女 19 IS95003 王敏 女 22 MA95004 张立 男 19 IS95005 刘刚 男 18 MA95006 孙庆 男 23 CS95007 易思玲 女 19 MA95008 李娜 女 18 CS95009 梦圆圆 女 18 MA95010 孔小涛 男 19 CS95011 包小柏 男 18 MA95012 孙花 女 20 CS95013 冯伟 男 21 CS95014 王小丽 女 19 CS95015 王君 男 18 MA95016 钱国 男 21 MA95017 王风娟 女 18 IS95018 王一 女 19 IS95019 邢小丽 女 19 IS95020 赵钱 男 21 IS95021 周二 男 17 MA95022 郑明 男 20 MA
创建测试数据表
> create table t_p(Sno int,Sname string) row format delimited fields terminated by ',';
//结合mapreduce。map输出的数据都有分区的概念,分区的时候有一个根据key来partionar, cluster by即指定key是根据哪个字段来排序,则reduce拿到的数据就是hashKey%bucket的个数,形成bucket个数的文件,sort by:每个bucket的文件内部数据排序
distribute by指定分区字段 sort by:指定排序字段select Sno,Sname from stu_buck cluster by (Sno);OK95001 李勇95002 刘晨95003 王敏95004 张立95005 刘刚95006 孙庆95007 易思玲95008 李娜95009 梦圆圆95010 孔小涛95011 包小柏95012 孙花95013 冯伟95014 王小丽95015 王君95016 钱国95017 王风娟95018 王一95019 邢小丽95020 赵钱95021 周二95022 郑明//只排序 select Sno,Sname from stu_buck sort by (Sno);OK95001 李勇95002 刘晨95003 王敏95004 张立95005 刘刚95006 孙庆95007 易思玲95008 李娜95009 梦圆圆95010 孔小涛95011 包小柏95012 孙花95013 冯伟95014 王小丽95015 王君95016 钱国95017 王风娟95018 王一95019 邢小丽95020 赵钱95021 周二95022 郑明select Sno,Sname from stu_buck distribute by (Sno) sort by (Sno);OK95001 李勇95002 刘晨95003 王敏95004 张立95005 刘刚95006 孙庆95007 易思玲95008 李娜95009 梦圆圆95010 孔小涛95011 包小柏95012 孙花95013 冯伟95014 王小丽95015 王君95016 钱国95017 王风娟95018 王一95019 邢小丽95020 赵钱95021 周二95022 郑明
加载分桶数据到空表t_p
insert into table t_pselect Sno,Sname from stu_buck cluster by (Sno);
加载完成后查询新表数据
//hive表默认目录dfs -ls /user/hive/warehouse/;dfs -cat /user/hive/warehouse/t_p/000000_0;//应该也是4个同样的分桶
注:1、order by 输出数据一定全局有序,因此只有一个reducer(哪怕设置了 hive> set mapredce.job.reduces=4 运行sql时仍会被重置为1个),会导致当输入规模较大时,需要较长的计算时间。
2、sort by不是全局排序,其在数据进入reducer前完成排序。因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1,则sort by只保证每个reducer的输出有序,不保证全局有序。3、distribute by(字段)根据指定的字段将数据分到不同的reducer,且分发算法是hash散列。4、(Cluster by字段) 除了具有Distribute by的功能外,还会对该字段进行排序。因此,如果分桶和sort字段是同一个时,此时,cluster by = distribute by + sort by分桶表的作用:最大的作用是用来提高join操作的效率;
(思考这个问题:select a.id,a.name,b.addr from a join b on a.id = b.id;如果a表和b表已经是分桶表,而且分桶的字段是id字段做这个join操作时,还需要全表做笛卡尔积吗?)如果两个表的分桶个数不一致:那么分桶联查就没意义,但是为倍数的时候还是有意义的
insert overwrite table student_buckselect * from student cluster by(Sno) sort by(Sage); 报错,cluster 和 sort 不能共存开会往创建的分通表插入数据(插入数据需要是已分桶, 且排序的)
可以使用distribute by(sno) sort by(sno asc) 或是排序和分桶的字段相同的时候使用Cluster by(字段)
注意使用cluster by 就等同于分桶+排序(sort)
insert into table stu_buck
select Sno,Sname,Sex,Sage,Sdept from student distribute by(Sno) sort by(Sno asc);insert overwrite table stu_buck
select * from student distribute by(Sno) sort by(Sno asc);insert overwrite table stu_buck
select * from student cluster by(Sno); 作者:ForgetThatNight链接:https://www.jianshu.com/p/32011e9146ef來源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。