分桶:按照用户创建表时指定的分桶字段进行hash散列多个文件
1.hive分桶的原理
跟MR中的HashPartitioner的原理一模一样
MR中:按照key的hash值去模除以reductTask的个数
Hive中:按照分桶字段的hash值去模除以分桶的个数
2.hive分桶的作用
好处:
1、方便抽样
2、提高join查询效率
3.hive分桶和分区的区别
分桶表和分区表的 桶数 和 分区数的 决定机制:
分桶表的个数:由用户的HQL语句所设置的reduceTask的个数决定
表的分区的个数:也能由用户自定义指定。也能由程序自动生成, 分区是可以动态增长的
分桶表和分区表的个数的区别:
分桶表是一经决定,就不能更改,所以如果要改变桶数,要重新插入分桶数据
分区数是可以动态增长的
log日志
一天存一个分区
分桶表和分区表中数据的表现:
1、分桶表中的每个分桶中的数据可以有多个key值
2、分区表中的每个分区只有一个 key值
分桶表的个数:由用户的HQL语句所设置的reduceTask的个数决定
表的分区的个数:也能由用户自定义指定。也能由程序自动生成, 分区是可以动态增长的
分桶表和分区表的个数的区别:
分桶表是一经决定,就不能更改,所以如果要改变桶数,要重新插入分桶数据
分区数是可以动态增长的
log日志
一天存一个分区
分桶表和分区表中数据的表现:
1、分桶表中的每个分桶中的数据可以有多个key值
2、分区表中的每个分区只有一个 key值
4.hive分桶的操作
首先创建一个分桶的空表,注意:是分桶的空表
然后创建个临时表,往临时表导入数据
然后在从临时表中分桶查询出来的数据insert到分桶的空表里
4.1创建分桶表
create table bck_student(id int,name string,sex string, age int,department string) clustered by(sex) into 2 buckets row format delimited fields terminated by ",";
4.2创建临时表并导入数据
create table student(id int,name string,sex string, age int,department string) row format delimited fields terminated by ",";
load data local inpath "/home/hadoop/student.dat" into table student;
load data local inpath "/home/hadoop/student.dat" into table student;
select * from sutdent;
4.3从临时表中分桶查询出来的数据insert到分桶的空表里
开启分桶
set hive.enforce.bucketing =true;
set mapreduce.job.reduces=2;
注意:上面代码中的set mapreduce.job.reduces的数量要和分桶数量一样
insert into table bck_student select id,name,sex,age,department from student distribute by sex;