提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
大数据菜鸟的学习之路,听说写博客有助于学习。
一、Hive分区表
1.1 分区表概述
Hive分区操作作为常用优化手段之一,是非常重要的。作用是避免Hive进行全表查询,从而提高查询效率。
1.2 建表语句
create table dept_partition
(
deptno int, --部门编号
dname string, --部门名称
loc string --部门位置
)
partitioned by (day string)
row format delimited fields terminated by '\t';
1.3 分区表基本操作
1.3.1 增加和删除分区
增加单个分区
alter table dept_partition
add partition(day='20220403');
增加多个分区
alter table dept_partition
add partition(day='20220404') partition(day='20220405');
删除分区
alter table dept_partition
drop partition (day='20220404'), partition(day='20220405');
修复分区
Hive将分区表的所有分区信息都保存在了元数据中,只有元数据与HDFS上的分区路径一致时,分区表才能正常读写数据。若用户手动创建/删除分区路径,Hive都是感知不到的,这样就会导致Hive的元数据和HDFS的分区路径不一致。再比如,若分区表为外部表,用户执行drop partition命令后,分区元数据会被删除,而HDFS的分区路径不会被删除,同样会导致Hive的元数据和HDFS的分区路径不一致。
若出现元数据和HDFS路径不一致的情况,可通过如下几种手段进行修复。
- add partition
- 若手动创建HDFS的分区路径,Hive无法识别,可通过add
partition命令增加分区元数据信息,从而使元数据和分区路径保持一致。 - drop partition
- 若手动删除HDFS的分区路径,Hive无法识别,可通过drop partition命令删除分区元数据信息,从而使元数据和分区路径保持一致。
- msck
- 若分区元数据和HDFS的分区路径不一致,还可使用msck命令进行修复,以下是该命令的用法说明。
msck repair table table_name [add/drop/sync partitions];
无论是增加、删除还是同步分区操作,针对的都是元数据,而非hdfs
1.3.2 动态分区
动态分区是指向分区表insert数据时,被写往的分区不由用户指定,
而是由每行数据的最后一个字段的值来动态的决定。使用动态分区,可只用一个insert语句将数据写入多个分区。
动态分区相关参数
(1)动态分区功能总开关(默认true,开启)
set hive.exec.dynamic.partition=true
(2)严格模式和非严格模式
动态分区的模式,默认strict(严格模式),要求必须指定至少一个分区为静态分区,nonstrict(非严格模式)允许所有的分区字段都使用动态分区。
set hive.exec.dynamic.partition.mode=nonstrict
(3)一条insert语句可同时创建的最大的分区个数,默认为1000。
set hive.exec.max.dynamic.partitions=1000
(4)单个Mapper或者Reducer可同时创建的最大的分区个数,默认为100。
set hive.exec.max.dynamic.partitions.pernode=100
(5)一条insert语句可以创建的最大的文件个数,默认100000。
hive.exec.max.created.files=100000
(6)当查询结果为空时且进行动态分区时,是否抛出异常,默认false。
hive.error.on.empty.partition=false
二、Hive分桶表
2.1 概述
分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区。对于一张表或者分区,Hive
可以进一步组织成桶,也就是更为细粒度的数据范围划分,分区针对的是数据的存储路径,分桶针对的是数据文件。
分桶表的基本原理是,首先为每行数据计算一个指定字段的数据的hash值,然后模以一个指定的分桶数,最后将取模运算结果相同的行,写入同一个文件中,这个文件就称为一个分桶(bucket)。
2.2 分桶表基本语法
2.2.1 建表语句
hive (default)>
create table stu_buck(
id int,
name string
)
clustered by(id)
into 4 buckets
row format delimited fields terminated by '\t';
2.2.2 分桶排序表
hive (default)>
create table stu_buck_sort(
id int,
name string
)
clustered by(id) sorted by(id)
into 4 buckets
row format delimited fields terminated by '\t';
总结
以上是对Hive分区表和分桶表的简单认识,后续会优化。