当前位置: 首页 > news >正文

Hive 分区详解:从基础概念到实战应用

一、为什么要分区?

1.将大规模数据按规则(如时间、地域)划分到不同目录,提升数据组织性。

2.通过分区过滤,减少扫描数据量,显著提升查询效率。

3.不同分区可对应不同业务线或权限,增强数据隔离性。

二、如何分区?

核心语法

CREATE TABLE table_name(col1 STRING,col2 INT
) 
PARTITIONED BY (partition_col STRING, ...) -- 分区字段定义
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

分区字段:独立于表结构的伪列,物理存储为 HDFS 目录,查询时可直接使用。

分级分区:支持多级分区(如PARTITIONED BY (year, month, day)),对应多级目录。

三、分区实战

1. 一级分区(单字段分区)

场景:按日期分区(如dt=20230825)。
步骤

  1. 建表
    CREATE TABLE user_log(uid STRING,action STRING
    ) 
    PARTITIONED BY (dt STRING);
    
  2. 加载数据
    LOAD DATA LOCAL INPATH '/data/user1.txt' INTO TABLE user_log PARTITION (dt='20230825');
    
  3. 查询
    SELECT * FROM user_log WHERE dt='20230825'; -- 直接使用分区字段过滤
    

2. 二级分区(双字段分区)

建表

CREATE TABLE order_data(order_id STRING,amount DOUBLE
) 
PARTITIONED BY (country STRING, date STRING);

加载数据

LOAD DATA INPATH '/data/order_us_202308.txt' INTO TABLE order_data 
PARTITION (country='us', date='20230801');

3. 分区字段大小写测试

字段名:不区分大小写(如PARTITIONED BY (Dt STRING)dt等价)。

字段值:区分大小写(如dt='20230825'Dt='20230825'视为不同分区)。

四、分区操作高级技巧

1. 动态分区(重点)

场景:根据数据内容自动创建分区(如按订单国家和日期动态分区)。
步骤

  1. 配置参数
    SET hive.exec.dynamic.partition=true; -- 开启动态分区(默认开启)
    SET hive.exec.dynamic.partition.mode=nonstrict; -- 非严格模式(允许全动态分区)
    SET hive.exec.max.dynamic.partitions.pernode=500; -- 单节点最大分区数
    
  2. 创建目标表
    CREATE TABLE order_dynamic(order_id STRING
    ) 
    PARTITIONED BY (country STRING, order_date STRING);
    
  3. 动态插入数据
    INSERT OVERWRITE TABLE order_dynamic PARTITION (country, order_date)
    SELECT order_id, country, order_date FROM raw_orders; -- 分区字段需为SELECT后两位
    

2. 混合分区(静态 + 动态)

场景:固定年份 + 动态月日分区。
示例

INSERT INTO dy_part2 PARTITION (year='2019', month, day) -- year为静态分区,month/day为动态
SELECT id, name, month, day FROM temp_part2;

3. 分区管理命令

添加分区

ALTER TABLE user_log ADD PARTITION (dt='20230826'); -- 空分区
ALTER TABLE user_log ADD PARTITION (dt='20230827') LOCATION '/hive/user_log/dt=20230827'; -- 指定路径
ALTER TABLE user_log DROP PARTITION (dt='20230825');
SHOW PARTITIONS user_log;

    五、分区数据关联的三种方式

    1. 方式一:上传数据后修复(适合非 Hive 创建的分区)
      MSCK REPAIR TABLE user_log; -- 自动扫描HDFS目录并关联元数据
      
    2. 方式二:手动添加分区
      使用ALTER TABLE ADD PARTITION命令,需指定分区路径。
    3. 方式三:LOAD 直接写入分区
      在建表后直接通过LOAD ... PARTITION加载数据,自动创建分区。

    六、分区类型对比

    类型特点适用场景
    静态分区分区字段值在插入时明确指定,需提前规划已知分区规则的历史数据
    动态分区分区字段值由数据动态生成,无需预先创建实时数据或未知分区场景
    混合分区部分静态 + 部分动态,平衡灵活性与可控性固定维度 + 变化维度组合
    http://www.xdnf.cn/news/651925.html

    相关文章:

  • R 语言科研绘图 --- 热力图-汇总
  • Linux系统:动静态库的制作与安装
  • ollama list模型列表获取 接口代码
  • Python环境搭建
  • 220Vac 1kW 无刷直流电机驱动器硬件方案
  • Spring AI 之多模态
  • [BUG]Debian/Linux操作系统中 安装 curl等软件显示无候选安装(E: 软件包 curl 没有可安装候选)
  • 国芯思辰| SerDes芯片SCS5501/SCS5502助力汽车触屏流媒体后视镜,兼容MAX9295A/MAX96717
  • Oracle 的 TX、TM、UL 锁对比
  • 【后端高阶面经:MongoDB篇】40、怎么优化MongoDB的查询性能?
  • 001 dart刷题
  • QT6.9中opencv引用路径的其中一种设置
  • AlphaCore GPU 物理仿真引擎内测邀请
  • crc32代码设计
  • .NET 8使用AOT发布ASP.NET Core应用
  • 《软件工程》第 7 章 - 软件体系结构设计
  • Wan2.1 图生视频 多卡推理批量生成视频
  • 在Windows上,将 Ubuntu WSL 安装并迁移到 D 盘完整教程(含 Appx 安装与迁移导入)
  • Cocos Creator 之 Label的实际宽高改变文本背景大小及常用方法
  • 【Volumetric Heatmap热力图插件的使用】
  • SpringBoot性能优化的12招
  • Flutter Container组件、Text组件详解
  • 商城图片性能优化实战:懒加载与下一代格式的化学反应
  • 游戏行业DDoS防护:基于IP信誉库的实时拦截方案
  • ArrayBlockingQueue 和 LinkedBlockingQueue 有什么区别?
  • 第一章第2节:安全生命周期(识别→防护→检测→响应→恢复)
  • LitCTF2025 WEB
  • linux文件权限管理
  • 《软件工程》-第 1 章 软件与软件工程
  • Python 网络编程入门