桶表:
桶是将表的列通过Hash算法进一步分解成不同的文件存储。
对指定列计算hash值,根据hash值切分数据,目的是为了并行。
每一个桶对应一个文件(注意和分区的区别),一个作业产生的桶输出文件和reduce任务个数相同。分区是粗粒度的划分,桶是细粒度的划分,这样可以让查询发生在小范围的数据上,提高查询效率,适合进行表连接查询,适合用于采样分析。
桶表的特点: 为了取样更高效 为了获取更好的查询处理效率
Hive使用对分桶所用的值进行哈希,并用哈希结果除以桶的个数做取余运算的方式来分桶,保证了每个桶中都有数据,但每个桶中的数据条数不一定相等。
关键字clustered。
create table student4(sno int,sname string,sex string,sage int, sdept string) clustered by(sno) into 3 buckets row format delimited fields terminated by ‘,’;
set hive.enforce.bucketing = true;强制分桶。
load data local inpath ‘/home/hadoop/hivedata/students.txt’ overwrite into table student4;
分析:虽然设置了强制分桶,但实际student4表下面只有一个students一个文件。分桶也就是分区,分区数量等于文件数,所以上面方法并没有分桶。
create table stu_buck(sno int,sname string,sex string,sage int,sdept string)
clustered by(sno)
sorted by(sno DESC)
into 4 buckets
row format delimited fields terminated by ‘,’;
#设置变量,设置分桶为true, 设置reduce数量是分桶的数量个数
set hive.enforce.bucketing = true;
set mapreduce.job.reduces=4;
#可以往创建的分通表插入数据(插入数据需要是已分桶, 且排序的)
#可以使用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);
先分区在进行分桶
桶表
最新推荐文章于 2022-09-08 23:55:03 发布