分区表
- 分区表
- 分区表基本操作
- 创建分区表语法
- 加载数据到分区表中
- 准备数据
- 加载数据
- 增加分区
- 创建单个分区
- 同时创建多个分区
- 删除分区
- 删除单个分区
- 同时删除多个分区
- 查看分区表有多少分区
- 查看分区表结构
- 二级分区
- 创建二级分区表
- 正常的加载数据
- 加载数据到二级分区表中
- 查询分区数据
- 把数据直接上传到分区目录上,让分区表和数据产生关联的三种方式
- 动态分区调整
- 开启动态分区参数设置
- 相关配置项
- 案例
分区表
分区表实际上就是对应一个 HDFS 文件系统上的独立的文件夹,该文件夹下是该分区所 有的数据文件。Hive 中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据 集。在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区,这样的查询效率 会提高很多。
分区表基本操作
创建分区表语法
注意:分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列。
create table user_partition(
no int,
name string,
)
partitioned by (day string)
row format delimited fields terminated by '\t';
加载数据到分区表中
准备数据
20230312.log
20230313.log
20230314.log
加载数据
注意:分区表加载数据时,必须指定分区
load data local inpath
'/data/20230312.log' into table user_partition partition(day='20230312');
load data local inpath
'/data/20230313.log' into table user_partition partition(day='20230313');
load data local inpath
'/data/20230314.log' into table user_partition partition(day='20230314');
增加分区
创建单个分区
alter table user_partition add partition(day='20230311');
同时创建多个分区
alter table user_partition add partition(day='20230309') partition(day='20230310');
删除分区
删除单个分区
alter table user_partition drop partition (day='20230309');
同时删除多个分区
alter table user_partition drop partition (day='20230311'), partition(day='20230310');
查看分区表有多少分区
show partitions user_partition;
查看分区表结构
desc formatted user_partition;
二级分区
创建二级分区表
create table access_log( id int, name string, loc string
) partitioned by (day string, hour string);
正常的加载数据
加载数据到二级分区表中
load data local inpath '/data/access_20230312.log' into table access_log partition(day='202303', hour='12');
查询分区数据
select * from access_log where day='202303' and hour='12';
把数据直接上传到分区目录上,让分区表和数据产生关联的三种方式
- 方式一:上传数据后修复 上传
hive (default)> dfs -mkdir -p
/hive/warehouse/op_log.db/access_log/day=202303/hour=12;
hive (default)> dfs -put /data/access_20230312.log
/hive/warehouse/op_log.db/access_log/day=202303/hour=12;
查询数据(查询不到刚上传的数据)
select * from access_log where day='202303' and hour='12';
执行修复命令
msck repair table access_log;
执行查询
- 方式二:上传数据后添加分区上
hive (default)> dfs -mkdir -p
/hive/warehouse/op_log.db/access_log/day=202304/hour=14;
hive (default)> dfs -put /data/access_20230414.log
/hive/warehouse/op_log.db/access_log/day=202304/hour=14;
执行添加分区
hive (default)> alter table access_log add partition(day='202304',hour='14');
执行查询
- 方式三:创建文件夹后 load 数据到分区 创建目录
建目录
hive (default)> dfs -mkdir -p
/hive/warehouse/op_log.db/access_log/day=202303/hour=15;
上传数据
hive (default)> load data local inpath '/data/access_20230315.log' into table access_log partition(day='202303',hour='15');
执行查询
动态分区调整
关系型数据库中,对分区表 Insert 数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive 中也提供了类似的机制,即动态分区(Dynamic Partition),只不过, 使用 Hive 的动态分区,需要进行相应的配置。
开启动态分区参数设置
相关配置项
开启动态分区功能(默认 true,开启)
hive.exec.dynamic.partition=true
设置为非严格模式(动态分区的模式,默认 strict,表示必须指定至少一个分区为 静态分区,nonstrict 模式表示允许所有的分区字段都可以使用动态分区。)
hive.exec.dynamic.partition.mode=nonstrict
在所有执行 MR 的节点上,最大一共可以创建多少个动态分区。默认 1000
hive.exec.max.dynamic.partitions=1000
在每个执行 MR 的节点上,最大可以创建多少个动态分区。该参数需要根据实际 的数据来设定。比如:源数据中包含了一年的数据,即 day 字段有 365 个值,那么该参数就
需要设置成大于 365,如果使用默认值 100,则会报错。
hive.exec.max.dynamic.partitions.pernode=100
整个 MR Job 中,最大可以创建多少个 HDFS 文件。默认 100000
hive.exec.max.created.files=100000
当有空分区生成时,是否抛出异常。一般不需要设置。默认 false
hive.error.on.empty.partition=false
案例
需求:将 user 表中的数据按照地区(loc 字段),插入到目标表 person 的相应 分区中。
- 创建目标分区表
hive (default)> create table user_partition(id int, name string) partitioned by (loc int) row format delimited fields terminated by '\t';
- 设置动态分区
set hive.exec.dynamic.partition.mode = nonstrict;
hive (default)> insert into table user_partition partition(loc) select id, name, loc from user;
- 查看目标分区表的分区情况
hive (default)> show partitions user_partition;