【大数据】Hive系列之- Hive-分区表(静态分区和动态分区)
创始人
2025-05-28 16:10:54

分区表

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

分区表

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

希望对正在查看文章的您有所帮助,记得关注、评论、收藏,谢谢您

相关内容

热门资讯

八部门17项举措力推“人工智能... 近日,商务部等八部门发布《关于加快“人工智能+消费”发展的实施意见》,围绕提升人工智能+商品消费、扩...
机构:资金或持续向高景气方向缩... 端午节前四个交易日,A股震荡上行,创业板指与科创50指数双双创下历史新高,科技板块表现出明显的相对优...
财富板块适配人才难招,券商分支... A股市场交投持续活跃,也带动券商财富管理人才需求旺盛。记者注意到,今年以来,多家券商分支机构密集发布...
智能化驱动证券类App月活稳健... 易观千帆最新数据显示,5月份,证券类App月活跃人数(以下简称“月活”)达1.82亿,环比增长1.5...
湖南黄金迎密集新老交接:56岁... 澎湃新闻记者 贺梨萍湖南省属国有矿业龙头湖南黄金(002155.SZ)正在密集进行核心岗位的人事新老...