hive实现全自动动态分区

本文介绍了在大数据场景下如何使用Hive实现全自动动态分区。通过设置参数如hive.exec.max.dynamic.partitions.pernode和hive.exec.max.dynamic.partitions,解决分区过多导致的错误。将原有数据映射为临时表,创建缺少分区字段的分区表,然后利用临时表的最后一个字段作为分区依据进行插入,从而实现按bdp_day字段值动态分区存储。
部署运行你感兴趣的模型镜像

我们在业务中往往会遇到一种情况就是:

现有的业务已经有很多的数据堆积,并且需要根据现有的数据以分区的形式来建立数据仓库,这样的话就需要将表中的一个字段作为分区字段,以这个字段的值作为分区的依据。

那么就需要动态分区进行处理:

首先需要设置参数:


-- 表示开启动态分区功能 (默认false)
set hive.exec.dynamic.partition =true


--(默认strict),表示允许所有分区都是动态的,否则必须有静态分区字段
set hive.exec.dynamic.partition.mode = nonstrict

然后是可以调整的参数:(在这里遇到过坑,分区数太多,超出默认限制)

set  hive.exec.max.dynamic.partitions.pernode=100 (默认100,一般可以设置大一点,比如1000)

       表示每个maper或reducer可以允许创建的最大动态分区个数,默认是100,超出则会报错。

   set hive.exec.max.dynamic.partitions =1000(默认值)

       表示一个动态分区语句可以创建的最大动态分区个数,超出报错

   set hive.exec.max.created.files =10000(默认) 全局可以创建的最大文件个数,超出报错。

 

设置完参数之后,将原有的数据映射成临时表,将所有的字段映射进去,包括分区的字段。

然后设置分区表,跟临时表少了一个字段,就是分区的字段,

然后插入分区表,注意bdp_day是分区字段,在临时表中的最后需要查询出来,然后默认以临时表的最后一个字段作为分区字段,插入数据。

insert overwrite table ods_release.ods_01_release_session partition(bdp_day)
select
rel.release_session,
rel.release_status,
rel.device_num,
rel.device_type,
rel.sources,
rel.channels,
from_unixtime(rel.ct,'HH'),
from_unixtime(rel.ct,'yyyy-MM-dd HH:mm:ss'),
from_unixtime(rel.ct,'yyyy-MM-dd') as bdp_day
from
ods_release.ods_01_release_session_tmp rel

这样就将bdp_day的值作为分区的值,分成多个分区存储,也就是在hdfs中分成了多个目录进行存储。

 

 


 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<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、付费专栏及课程。

余额充值