- hive分区。默认是静态分区。
- 分区的好处:将列值作为目录存放数据,这样查询时,根据分区列过滤,只需查询对应目录下的数据,快速定位,查询效率高。
- Hive的分区方式:Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并非一个实际字段。
- 当在插入数据的时候指定分区,其就是新建一个目录或者子目录,或者在原有的目录上添加数据文件
静态分区
- 静态分区分区的值是确定的
- 新增分区或者是加载分区数据时,已经指定分区名
creare table if not exists tablename (ids int, name string) partitioned by(year int, month int);
动态分区
- 分区的值是非确定的,由输入数据来确定
实现:
1. 先打开动态分区的设置
set hive.exec.dynamic.partition=true; # 是否允许动态分区
set hive.exec.dynamic.partition.mode=nonstrict;
- strict:严格模式,最少需要有一个是静态分区
- nostrict:可以全部是动态分区
设置动态分区,以上两点必须设置
- 可选:
hive.exec.max.dynamic.partitions=1000
- 允许动态分区的最大数量(默认1000)
hive.exec.max.dynamic.partitions.pernode =100
- 单个节点上的mapper/reducer允许创建的最大分区(默认100)
hive.exec.max.created.files
- 所有映射器和化简器创建的最大文件总数(默认值为100000)
- 每当创建新文件时,每个映射器/缩减器都会更新Hadoop计数器,从而实现此目的。如果总数超过hive.exec.max.created.files,将引发致命错误并杀死作业。
2.
- 建表
create table if not exists tablename(ids int, name string, year int, month int)
- 创建动态分区
insert into table tablename(ids int, name string) partitioned by (year, month);
注意事项:
- 动态分区的时候,将会为每一个分区分配reducer数量,当分区数量多的时候,reducer数量将会增加,对服务器是一种灾难
- 静态分区不管有无数据都会创建分区,动态分区是有结果集才创建
- hive动态分区的严格模式,是为了阻止用户不小心提交恶意hql
将会阻止以下三种查询: - 对分区表查询,where中过滤字段不是分区字段 - 笛卡尔积join查询,join查询语句,不带on或where条件 - 对order by查询,不带limit语句