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. 关键考量
      ├── 优势:查询性能高、数据管理灵活
      └── 注意:避免数据倾斜、合理选择分区列、注意小文件问题
相关推荐
曾阿伦1 天前
Windows 下运行 Hadoop 并部署到 AWS EMR 指南
hadoop·windows·aws
罗政2 天前
基于AI工作流的多渠道销售数据仓库清洗统计实践
数据仓库
极光代码工作室2 天前
基于Spark的日志监控与分析平台
大数据·hadoop·python·spark·数据可视化
迈巴赫车主3 天前
湖仓一体(Data Lakehouse)简介
大数据·数据仓库·数据湖·湖仓一体
liuxiaowei33 天前
Winform+WPF双框架实战:喷涂工艺SCADA上位机从0到1搭建(附采集监控源码+车间踩坑实录)
大数据·hadoop·wpf
humbinal4 天前
同时支持 gui & cli 的 parquet 文件查看工具,高性能小清新!
hive·python·rust·spark·开源·github·parquet
RestCloud6 天前
ETL是什么?全域数据集成平台核心能力解析
数据仓库·etl·数据清洗·数据处理·etlcloud·数据集成工具
Gent_倪6 天前
万字详解:数据库、数据仓库、数据湖、湖仓一体
数据库·数据仓库·spark
Microsoft Word6 天前
把RAG从 “能跑” 做到上线
数据仓库·人工智能
hkNaruto6 天前
【大数据】《传统Hadoop大数据技术入门:补充与进阶——从数据格式到智能决策的问答实录》
大数据·hadoop·分布式