分区表

  • 分区表
  • 分区表基本操作
  • 创建分区表语法
  • 加载数据到分区表中
  • 准备数据
  • 加载数据
  • 增加分区
  • 创建单个分区
  • 同时创建多个分区
  • 删除分区
  • 删除单个分区
  • 同时删除多个分区
  • 查看分区表有多少分区
  • 查看分区表结构
  • 二级分区
  • 创建二级分区表
  • 正常的加载数据
  • 加载数据到二级分区表中
  • 查询分区数据
  • 把数据直接上传到分区目录上,让分区表和数据产生关联的三种方式
  • 动态分区调整
  • 开启动态分区参数设置
  • 相关配置项
  • 案例


分区表

分区表实际上就是对应一个 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;