Hive 分区详解:从基础概念到实战应用 [复制链接]
发表于 2025-7-25 18:20:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、为什么要分区?

1.将大规模数据按规则(如时间、地区)划分到差别目次,提升数据组织性。
2.通过分区过滤,淘汰扫描数据量,显著提升查询效率。
3.差别分区可对应差别业务线或权限,增强数据隔离性。
二、怎样分区?

核心语法
  1. CREATE TABLE table_name(
  2.     col1 STRING,
  3.     col2 INT
  4. )
  5. PARTITIONED BY (partition_col STRING, ...) -- 分区字段定义
  6. ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
复制代码
分区字段:独立于表结构的伪列,物理存储为 HDFS 目次,查询时可直接使用。
分级分区:支持多级分区(如PARTITIONED BY (year, month, day)),对应多级目次。
三、分区实战

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

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

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

建表
  1. CREATE TABLE order_data(
  2.     order_id STRING,
  3.     amount DOUBLE
  4. )
  5. PARTITIONED BY (country STRING, date STRING);
复制代码
加载数据
  1. LOAD DATA INPATH '/data/order_us_202308.txt' INTO TABLE order_data
  2. PARTITION (country='us', date='20230801');
复制代码
3. 分区字段大小写测试

字段名:不区分大小写(如PARTITIONED BY (Dt STRING)与dt等价)。
字段值:区分大小写(如dt='20230825'与Dt='20230825'视为差别分区)。
四、分区操作高级本领

1. 动态分区(重点)

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

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

场景:固定年份 + 动态月日分区。
示例
  1. INSERT INTO dy_part2 PARTITION (year='2019', month, day) -- year为静态分区,month/day为动态
  2. SELECT id, name, month, day FROM temp_part2;
复制代码
3. 分区管理命令

添加分区
  1. ALTER TABLE user_log ADD PARTITION (dt='20230826'); -- 空分区
  2. ALTER TABLE user_log ADD PARTITION (dt='20230827') LOCATION '/hive/user_log/dt=20230827'; -- 指定路径
复制代码
  1. ALTER TABLE user_log DROP PARTITION (dt='20230825');
复制代码
  1. SHOW PARTITIONS user_log;
复制代码
五、分区数据关联的三种方式


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

范例特点实用场景静态分区分区字段值在插入时明确指定,需提前规划已知分区规则的汗青数据动态分区分区字段值由数据动态生成,无需预先创建实时数据或未知分区场景混淆分区部分静态 + 部分动态,平衡机动性与可控性固定维度 + 变化维度组合
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表