【Hive】(五)Hive 中动态分区与静态分区详解

本文深入解析Hive中的静态分区和动态分区概念,详细介绍如何创建分区表、加载数据及使用动态分区进行数据插入的方法。


Hive中的分区有两种:动态分区和静态分区

一、静态分区

静态分区
1、创建分区表

hive> create table stu2(
    > id int,
    > name string,
    > likes array<string>,
    > adress map<string,string>
    > )
    > partitioned by (age int,sex string)
    > row format delimited
    > fields terminated by ','
    > collection items terminated by '-'
    > map keys terminated by ':'
    > lines terminated by '\n';

2、加载数据到分区表

hive> load data local inpath '/opt/soft/stu.txt' into table stu2
    > partition (age=20,sex="male");
alter table stu2 add partition(age=10,sex='female'); 
// 

show partitions stu2;   // 查看分区

alter table stu2 drop partition(age=10,sex='female');

3、这种手动指定分区加载数据,就是常说的静态分区的使用。但是在日常工作中用的比较多的是动态分区。
静态分区是在创建表的时候就指定分区或者将表已经创建之后再指定分区(使用alter关键字)

二、动态分区

1、创建目标表

hive> create table stuo1(
    > id int,
    > name string,
    > age int,
    > gender string,
    > likes array<string>,
    > address map<string,string>
    > )
    > row format delimited
    > fields terminated by ','
    > collection items terminated by '-'
    > map keys terminated by ':'
    > lines terminated by '\n';
hive> create table stuo2(
    > id int,
    > name string,
    > likes array<string>,
    > address map<string,string>
    > )
    > partitioned by (age int,gender string)
    > row format delimited
    > fields terminated by ','
    > collection items terminated by '-'
    > map keys terminated by ':'
    > lines terminated by '\n';

2、采用动态方式加载数据到目标表
加载之前先设置一下下面的参数

hive> set hive.exec.dynamic.partition=true;
hive> set hive.exec.dynamic.partition.mode=nonstrict;

开始加载

hive> insert into table stuo2 partition(age,gender)
    > select id,name,likes,address,age,gender from stuo1;

上面加载数据方式并没有指定具体的分区,只是指出了分区字段。在select最后一个字段必须跟你的分区字段,这样就会自行根据(age,gender)的value来分区。
3、验证一下
在这里插入图片描述
在这里插入图片描述
创建动态分区表:

首先是要创建静态分区表;然后将表设置为非严格模式;再次创建动态分区表,并加载数据

加载数据的时候,是按照静态分区的模式,将数据加载到动态分区中去

<think> 我们正在讨论Hive中的动态分区静态分区。用户已经提供了三个引用,这些引用涉及动态分区静态分区的定义、设置以及使用场景。用户的问题明确要求解释两者的区别、特点及使用方法。 根据引用[1][3]: - 静态分区是手动指定分区值,而动态分区是根据数据的值自动分配分区。 - 静态分区在创建表时或之后(使用ALTER)指定分区,而动态分区在插入数据时自动创建分区。 引用[2]提供了Hive设置动态分区的参数: - `hive.exec.dynamic.partition=true`:启用动态分区。 - `hive.exec.dynamic.partition.mode=nonstrict`:允许所有分区列都使用动态分区(非严格模式)。在严格模式下,必须至少有一个静态分区。 我们需要组织回答: 1. 定义核心区别。 2. 特点(优缺点)。 3. 使用方法(包括SQL示例配置)。 4. 使用场景。 同时,根据用户之前的提问历史,我们之前回答了Hive内部表外部表的区别,所以可以适当关联(比如在分区表的使用上,内部表外部表都可以使用分区,但分区管理方式相同)。 回答结构: 一、概念核心区别 二、静态分区详解(特点、操作步骤) 三、动态分区详解(特点、操作步骤、配置参数) 四、对比总结(优缺点、适用场景) 、操作示例(静态分区插入、动态分区插入) 六、选择建议 最后,生成相关问题。 注意:在回答中,对于引用的地方,在段落末尾添加引用标识,例如[^1]。 </think> ### Hive 动态分区静态分区详解 以下从 **核心区别**、**特点对比**、**使用方法** 三个维度展开分析,结合 Hive SQL 示例说明: --- #### 一、核心区别 | **特性** | **静态分区** | **动态分区** | |------------------|---------------------------------------------|---------------------------------------------| | **分区指定方式** | 手动显式指定分区值 | 根据数据列值**自动推断**分区 | | **语法要求** | 必须硬编码分区值(如 `PARTITION (dt='2023-01')`) | 仅需指定分区列名(如 `PARTITION (dt)`) | | **灵活性** | 低(每次插入需修改 SQL) | 高(自动适应新分区值) | | **适用场景** | 分区值已知且固定 | 分区值动态变化或未知 | > **类比理解**: > - **静态分区** ≈ 图书馆管理员**手动**将书放入指定编号书架 > - **动态分区** ≈ 书籍根据条形码**自动滑入**对应分类区域 [^1] --- #### 二、特点对比 | **维度** | **静态分区** | **动态分区** | |----------------|-------------------------------------------|-------------------------------------------| | **性能** | ✅ 更快(直接定位分区) | ⚠️ 较慢(需扫描数据推断分区,资源消耗大) | | **易用性** | ⚠️ 需频繁修改 SQL | ✅ 一次配置自动处理 | | **数据准确性** | ✅ 高(人工控制) | ⚠️ 依赖源数据质量(列值错误导致分区错误) | | **并发控制** | ✅ 安全(单分区写入) | ⚠️ 需监控(可能同时创建多个分区) | --- #### 三、使用方法 ##### 1. **静态分区操作** ```sql -- 创建分区表 CREATE TABLE logs (msg STRING) PARTITIONED BY (dt STRING, hour STRING); -- 手动插入数据到指定分区(显式指定分区值) INSERT INTO TABLE logs PARTITION (dt='2023-10-01', hour='08') VALUES ('Error: connection timeout'); ``` ##### 2. **动态分区操作** ```sql -- 启用动态分区(必需配置) SET hive.exec.dynamic.partition = true; SET hive.exec.dynamic.partition.mode = nonstrict; -- 允许全动态分区[^2] -- 从源表动态导入(根据src表的dt/hour列自动创建分区) INSERT INTO TABLE logs PARTITION (dt, hour) SELECT msg, dt, hour FROM src_table; ``` > **关键配置**: > - `hive.exec.max.dynamic.partitions`:单次任务最大分区数(默认1000) > - `hive.exec.max.dynamic.partitions.pernode`:单节点最大分区数(默认100) ##### 3. **混合使用场景** ```sql -- 静态分区(年) + 动态分区(月、日) INSERT INTO sales PARTITION (year=2023, month, day) SELECT product, amount, month, day FROM raw_data; ``` --- #### 四、选择建议 | **场景** | **推荐方式** | **原因** | |-------------------------|--------------|------------------------------------------| | 分区值固定且少量 | 静态分区 | 性能高,操作简单 | | 分区值变化频繁/海量 | 动态分区 | 避免手动维护,适应新分区[^3] | | 增量数据导入(如每日) | 动态分区 | 自动创建当日分区 | | 历史数据修补 | 静态分区 | 精准控制目标分区 | > **动态分区典型用例**: > - 日志分析(按时间自动分区) > - 用户行为数据(按地区/设备自动分组)[^1] --- ### 相关问题 1. 动态分区导致小文件过多,如何优化 HDFS 存储? 2. 如何监控 Hive 动态分区的性能瓶颈? 3. 动态分区插入时出现数据倾斜该如何解决? 4. 静态分区动态分区Hive ACID 事务的支持有何差异
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值