Hive分区分桶
前言
分区和分桶最大的区别就是分桶随机分割数据库,分区是非随机分割数据库。 因为分桶是按照列的哈希函数进行分割的,相对比较平均;而分区是按照列的值来进行分割的,容易造成数据倾斜。 其次两者的另一个区别就是分桶是对应不同的文件(细粒度),分区是对应不同的文件夹(粗粒度)。
提示:以下是本篇文章正文内容,下面案例可供参考
一、分区
1.简介
当Hive在进行select操作时,正常会扫描整个表内容。而随着系统运行的时间增加,表的数据量也越来越大,而hive查询做全表扫描,会消耗很多时间,降低效率。而有时候,我们需求的数据只需要扫描表中的一部分数据即可。于是,hive在建表时引入了partition概念。即在建表时,将整个表存储在不同的子目录中,每一个子目录对应一个分区。在查询时,我们就可以指定分区查询,避免了hive做全表扫描,从而提高查询效率。
2.语法
create table tableName(
.......
)
partitioned by (colName colType [comment '...'],...)
3.示例
create table if not exists example1(
id int,
name string,
age int
)
partitioned by (dt string)
row format delimited
fields terminated by ','
lines terminated by '\n';
二级分区:
create table if not exists example2(
id int,
name string,
age int
)
partitioned by (year string,month string)
row format delimited
fields terminated by ',';
二、分桶
1.简介
在 Hive 中,通过对表中的列运用哈希函数做哈希计算,根据计算出来的哈希值将表或分区细分为多个桶。而且每个桶的大小几乎一样。以便提高查询效率。
2.原理
类似MapReduce中的HashPartitioner的原理
MapReduce:使用key的hash值对reduce的数量进行取模(取余)
hive:使用分桶字段的hash值对分桶的数量进行取模(取余)。针对某一列进行分桶存储。每一条记录都是通过分桶字段的值的hash对分桶个数取余,然后确定放入哪个桶。
3.意义
分桶表适合进行数据抽样 抽样更高效。处理大数据时,如果能在数据集的一部分上运行查询进行测试会带来很多方便
4.示例
建表
create table example3(id int, name string)
clustered by(id)
into 4 buckets
row format delimited fields terminated by ' ';
设置reduce的数量:
set mapreduce.job.reduces=-1;
总结
这里对文章进行总结:
分区使用的是表外字段,分桶使用的是表内字段
分桶相对于更加细粒度的管理数据,更多的是使用来做抽样
cluster 和 clusted 的区别:一个是导入数据的时候调用的,一个是创建表的时候使用的。
sort by 和 sorted by 区别:sort by 是导入数据的时候,sorted by 是分桶排序规则指定的时候
partition by 和 partitioned by 的区别:partition by 一般和开窗函数一起使用,
partitioned by 建表的时候使用。