目录
分区和分桶总结
1、分区
1、分区介绍
由于数据量过于庞大,使用分区,可以并行的进行处理数据,有点类似于Hadoop当中的切片操作,将数据分开,然后并行去处理,避免去全表扫描。
分区表在生产环境当中用的非常多。分区表实际上就是对应一个在HDFS(或者是其他分布式文件系统)文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件,Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过where子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。
并且,分区的指定的列其实是伪列,意思是不是真是存在的列。
2、分区表的操作
具体代码如下:
--建表语句
create table temp_table (
id string comment 'ID',
name string comment '姓名'
)comment '临时表'
partitioned by (day string);
--导入数据语句
load data local path 'x' overwrite into table temp_table partition(day='2021-05-01');
--增加分区
alter table temp_table add partition(day='2021-05-02') partition(day='2021-05-03');
--删除分区
alter table temp_table drop partition(day='2021-05-02'),partition(day='2021-05-03');
--查看分区
show partitions temp_table;
重点需要注意的是partitioned后面的ed,并且,分区字段是不存在列里面的,是一个独立的字段。查询的时候就当作是一个列来进行查询即可。二级分区和一级分区同理,就不重复写了。
load不指定分区的时候,将会放入一个默认的文件夹当中,有时候也会报错,一般需要指定分区。
3、动态分区
不指定固定的分区,而是,根据查询得到的分区字段去进行分区。是按照查询的最后一个字段来作为分区字段,在配置为严格模式下,不能进行动态分区,需要更改配置(Hive版本3之后可以省略partition,默认以最后的字段为分区字段)。代码如下:
insert table temp_table partition(day)
select name, day from temp_table;
--配置的信息是
hive.exec.dynamic.partition.mode=nonstrict
2、分桶表
1、分桶表介绍
分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可以形成合理的分区。对于一张表或者分区,Hive可以进一步组织成桶,也就是更为细粒度的数据范围划分。
分桶是将数据集分解成更容易管理的若干部分的另一个技术。一般用于数据集极大的情况,进行抽样查询。
分区针对的是数据的存储路径,分桶针对的是数据文件。
只能对一列进行分桶。表可以同时分区和分桶,当表分区时,每个分区下都会有<num_buckets> 个桶。当使用 SORTED BY … 在桶内排序时,指定排序的列和指定分桶的列无需相同。而且分桶表中插入数据的时候必然要执行一次MAPREDUCE,所以分桶表的数据只能通过从结果集查询插入的方式进行导入。
数据分桶的原理:
按照分桶字段的hash值去模除以分桶的个数。当join连接的字段值取hash不够均匀时,多取一个其它字段作为分桶字段;
bucket num = hash_function(bucketing_column) mod num_buckets
2、分桶表的操作
具体代码如下:
--创建分桶表
create table stu_buck(id int, name string)
clustered by (id) --注意必须要用存在的列
into 4 buckets --指定桶的个数
row format delimited fields terminated by '\t';
注意:
hive.enforce.bucketing为true时,reduce要设为-1;
hive.enforce.bucketing为false时,reduce要设为和分桶数一致;
如果bucketing为 true,reduce又设成大于1的输,会执行两个job。
3、分区表和分桶表的区别
分区和分桶最大的区别就是分桶随机分割数据库,分区是非随机分割数据库。
因为分桶是按照列的哈希函数进行分割的,相对比较平均;而分区是按照列的值来进行分割的,容易造成数据倾斜。其次两者的另一个区别就是分桶是对应不同的文件(细粒度),分区是对应不同的文件夹(粗粒度)。
当然,分区和分桶可以一起使用。
参考
https://www.bilibili.com/video/BV1EZ4y1G7iL?p=66
https://www.freesion.com/article/23851409747/