hive分区

1. 什么是分区表?

  • 定义:分区表是 Hive 中一种将数据按照指定列(分区列)的值进行分类存储的表。它通过在文件系统(如 HDFS)上创建不同的目录来区分不同分区的数据。

  • 核心目的

    • 优化查询性能 :查询时可以通过 WHERE 子句指定分区列的值,Hive 会直接扫描对应的分区目录,而无需扫描整个表的数据,从而大幅提升查询速度。
    • 数据管理:便于按业务维度(如日期、地区、部门)对数据进行管理、加载和删除。例如,可以只加载或删除某一天的日志数据。
  • 存储结构

    • 对于表 emp 和分区列 dept,其在 HDFS 上的目录结构可能如下:

    plaintext

    复制代码
    /user/hive/warehouse/emp/
    ├── dept=Engineering/
    │   ├── part-m-00000
    │   └── part-m-00001
    ├── dept=Sales/
    │   └── part-m-00000
    └── dept=HR/
        └── part-m-00000

创建分区表

关键语法partitioned by (column_name data_type)

示例

sql

复制代码
create table if not exists emp (
    empid string comment '员工ID',
    empname string comment '员工姓名',
    salary int comment '员工薪资'
)
partitioned by (dept string comment '部门名称') -- 指定分区列
row format delimited 
fields terminated by ','
stored as orc;
  • 注意
    • 分区列是虚拟列,它的值并不存储在数据文件中,而是从目录名中推断出来的。
    • 一个表可以有多个分区列 (例如 dt string, country string),形成多级分区目录。

向分区表导入数据

向分区表导入数据主要有两种方式:LOAD DATAINSERT ... SELECT

方法一:使用 LOAD DATA(直接加载文件到指定分区)

sql

复制代码
-- 加载本地文件到 'engineering' 分区
load data local inpath '/path/to/engineering_emp.txt' 
overwrite into table emp 
partition (dept='engineering');

-- 加载 HDFS 文件到 'sales' 分区
load data inpath '/path/to/hdfs/sales_emp.txt' 
into table emp 
partition (dept='sales');
  • OVERWRITE:覆盖分区内已有的数据。如果想追加数据,去掉此关键字。
  • Hive 会自动创建 dept=... 的目录,并将文件移动或复制到该目录下。
方法二:使用 INSERT ... SELECT(动态分区插入)

当需要从一个已存在的表中读取数据,并根据数据中的某一列动态地创建和填充多个分区时,使用动态分区。

sql

复制代码
-- 假设源表 emp_staging 包含 dept 列
insert overwrite table emp
partition (dept) -- 只指定分区列名
select empid, empname, salary, dept -- 查询结果的最后一列必须是分区列
from emp_staging;
  • 关键点
    1. PARTITION (dept): 只列出分区列名,不指定具体值。
    2. SELECT 语句的最后一列必须是分区列(dept)。Hive 会根据这一列的值自动创建分区。
    3. 通常需要设置参数 set hive.exec.dynamic.partition.mode = nonstrict; 来允许全动态分区(默认是 strict,要求至少有一个静态分区)。

查询分区表数据

  • 查询特定分区的数据(性能最高):

    sql

    复制代码
    select * from emp where dept = 'engineering';
  • 查询多个分区的数据

    sql

    复制代码
    select * from emp where dept in ('engineering', 'sales');
  • 查询所有分区的数据(等同于查询普通表):

    sql

    复制代码
    select * from emp;
  • 查看表的所有分区

    sql

    复制代码
    show partitions emp;

5. 修改和删除分区

  • 添加一个新的空分区

    sql

    复制代码
    alter table emp add partition (dept='finance');
  • 删除一个分区(会同时删除该分区对应的目录和数据):

    sql

    复制代码
    alter table emp drop partition (dept='finance');
    • 警告:此操作会永久删除数据,请谨慎使用。

总结思维导图

plaintext

复制代码
  Hive 分区表
  ├── 1. 创建
  │   └── create table ... partitioned by (col_name data_type) ...
  ├── 2. 导入数据
  │   ├── a. load data ... into table ... partition (col='value'); (静态分区)
  │   └── b. insert overwrite/into ... partition (col) select ...; (动态分区)
  │       └── set hive.exec.dynamic.partition.mode = nonstrict;
  ├── 3. 查询
  │   ├── a. select * from table where col = 'value'; (特定分区)
  │   ├── b. select * from table where col in ('v1', 'v2'); (多个分区)
  │   └── c. show partitions table; (查看所有分区)
  ├── 4. 管理
  │   ├── a. alter table table add partition (col='value'); (添加空分区)
  │   └── b. alter table table drop partition (col='value'); (删除分区及数据)
  └── 5. 关键考量
      ├── 优势:查询性能高、数据管理灵活
      └── 注意:避免数据倾斜、合理选择分区列、注意小文件问题
相关推荐
得物技术10 小时前
从“人治”到“机治”:得物离线数仓发布流水线质量门禁实践
大数据·数据仓库
小邓睡不饱耶11 小时前
Sqoop 实战:数据迁移核心案例、优化技巧与企业级落地
hive·hadoop·sqoop
沃达德软件13 小时前
重点人员动态管控系统解析
数据仓库·人工智能·hive·hadoop·redis·hbase
xianyinsuifeng14 小时前
RAG + Code Analysis 的标准路线
数据仓库·自动化·云计算·原型模式·aws
ruxshui15 小时前
个人笔记: 星环Inceptor/hive普通分区表与范围分区表核心技术总结
hive·hadoop·笔记
2501_9272835817 小时前
仓库升级进行时:当传统仓储遇到“四向穿梭车”
数据仓库·人工智能·自动化·wms·制造
Gain_chance18 小时前
26-学习笔记尚硅谷数仓搭建-DIM层特殊的维度表——用户维度表的建表、分析及DIM层数据装载脚本
数据仓库·hive·笔记·学习
TTBIGDATA1 天前
【Hue 】Hue 访问 YARN 返回 403 权限问题
大数据·hadoop·ambari·hdp·国产化·hue·bigtop
TTBIGDATA1 天前
【Knox】Knox 转发访问 Trino Web UI 返回 406 错误的原因与处理
大数据·运维·前端·hadoop·ui·ambari·hdp
Gain_chance2 天前
25-学习笔记尚硅谷数仓搭建-DIM层其余(优惠卷、活动、地区、营销坑位、营销渠道、日期)维度表建表语句、简单分析
数据仓库·笔记·学习