对现有Hive的大表进行动态分区

本文详细介绍了如何在Hive中创建和使用动态分区,包括修改Hive配置以支持动态分区、对现有表进行分区改造的过程及注意事项。动态分区能够简化大数据的批量导入,并通过函数操作提高灵活性。

分区是在处理大型事实表时常用的方法。分区的好处在于缩小查询扫描范围,从而提高速度。分区分为两种:静态分区static partition和动态分区dynamic partition。静态分区和动态分区的区别在于导入数据时,是手动输入分区名称,还是通过数据来判断数据分区。对于大数据批量导入来说,显然采用动态分区更为简单方便。

- 对现存hive表的分区

首先,新建一张我们需要的分区以后的表create table like 'origin'

若现存hive表中没有分区信息,我们需要手动修改hive配置数据库来增加hive表的分区信息。hive表分区存在PARTITION_KEYS数据表中,其中表项的| TBL_ID | PKEY_COMMENT | PKEY_NAME | PKEY_TYPE | INTEGER_IDX |分别是hive表名(在TBLS中存储),备注,分区名,分区索引的顺序。建立完成后我们就有一张类似于原始表,但是带有分区的表。

然后,我们修改一下hive的默认设置以支持动态分区:

set hive.exec.dynamic.partition=true;

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

第二步仅在你仅使用动态分区字段做分区索引时。

然后用hive的insert命令进行插入操作。注意,除了所有列外,需要将分区的动态字段跟在后面。

INSERT OVERWRITE TABLE target PARTITION (dt) 
SELECT id,user_id,app_id,time,ip,substr(time,0,10) FROM origin 

可以看到,动态分区的字段支持函数操作。

这样,我们得到了一张分区后的hive大表。


参考:https://cwiki.apache.org/Hive/dynamicpartitions.html



转载地址: http://blog.youkuaiyun.com/awayyao/article/details/7630000

# Hive动态分区使用指南 ## 一、动态分区基本概念 动态分区允许Hive根据查询结果自动创建分区,无需预先指定每个分区的值。 ### 与静态分区对比 ```mermaid graph LR A[分区方式] --> B[静态分区] A --> C[动态分区] B -->|需手动指定| D["INSERT INTO TABLE PARTITION(dt='20230801')"] C -->|自动推断| E["INSERT INTO TABLE PARTITION(dt)"] ``` ## 二、动态分区配置参数 ### 核心参数配置 ```sql -- 启用动态分区 SET hive.exec.dynamic.partition=true; -- 设置为非严格模式(允许所有分区都是动态的) SET hive.exec.dynamic.partition.mode=nonstrict; -- 每个mapper/reducer可创建的最分区数 SET hive.exec.max.dynamic.partitions.pernode=100; -- 整个SQL可创建的最分区数 SET hive.exec.max.dynamic.partitions=1000; -- 全局可创建的最分区数 SET hive.exec.max.created.files=100000; ``` ## 三、动态分区使用示例 ### 基础用法 ```sql -- 从现有导入数据(自动按dt,country分区) INSERT OVERWRITE TABLE sales_partitioned PARTITION(dt, country) SELECT order_id, amount, order_dt AS dt, country FROM sales_orders; ``` ### 混合分区(静态+动态) ```sql -- year为静态分区,month为动态分区 INSERT OVERWRITE TABLE logs_partitioned PARTITION(year='2023', month) SELECT log_id, content, month(dt) AS month FROM server_logs WHERE year(dt) = 2023; ``` ## 四、动态分区优化策略 ### 性能优化方法 ```sql -- 1. 合理设置分区字段顺序(高基数字段放后面) SET hive.exec.dynamic.partition.mode=nonstrict; SET hive.optimize.sort.dynamic.partition=true; -- 2. 合小文件(针对动态分区产生量小文件问题) SET hive.merge.mapfiles=true; SET hive.merge.mapredfiles=true; SET hive.merge.size.per.task=256000000; SET hive.merge.smallfiles.avgsize=16000000; -- 3. 控制reduce数量 SET mapred.reduce.tasks=50; ``` ## 五、动态分区常见问题 ### 问题排查 | 问题现象 | 可能原因 | 解决方案 | |---------|---------|---------| | 报错`Dynamic partition strict mode` | 未设置nonstrict模式 | 设置`hive.exec.dynamic.partition.mode=nonstrict` | | 报错`exceeds max created files` | 分区数超过限制 | 增`hive.exec.max.created.files`值 | | 执行速度慢 | 产生量小文件 | 配置合小文件参数 | | 数据倾斜 | 分区字段分布不均 | 调整字段顺序或预处理数据 | ## 六、动态分区最佳实践 ### 生产环境建议 1. **分区字段选择**: - 优先选择离散值字段 - 分区数量控制在100-1000之间 - 避免使用高基数字段(如user_id) 2. **数据预处理**: ```sql -- 对高基数字段做分桶处理 INSERT OVERWRITE TABLE sales_partitioned PARTITION(dt, country) SELECT order_id, amount, dt, CASE WHEN country IN ('US','UK') THEN country ELSE 'Other' END AS country FROM sales_orders; ``` 3. **监控措施**: ```sql -- 检查分区数量是否合理 SHOW PARTITIONS sales_partitioned; -- 分析分区数据分布 ANALYZE TABLE sales_partitioned PARTITION(dt, country) COMPUTE STATISTICS; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值