侧边栏壁纸
博主头像
phphi

phphi's blog

  • 累计撰写 51 篇文章
  • 累计收到 0 条评论

Day45 - Hive实战

2026-4-24 / 0 评论 / 1 阅读

Hive 实战

Hive 概述

Hive 是基于 Hadoop 的数据仓库工具,将 SQL(HiveQL) 转换为 MapReduce / Spark / Tez 任务执行,适合 PB 级离线数据分析。

核心作用

  1. 将结构化数据文件映射为数据库表
  2. 提供类 SQL 查询语言(HiveQL)操作大规模数据
  3. 底层依赖 HDFS 存储

Hive vs 关系型数据库

特性 Hive MySQL
场景 离线分析(OLAP) 事务处理(OLTP)
数据规模 PB 级 GB 级
延迟 高(秒~分钟) 低(毫秒)
更新 支持但效率低 高效支持
索引 有限 完善

存储格式

格式 特点
TEXTFILE 明文,可直接查看
ORC 列式存储,压缩率高(推荐)
Parquet 列式,跨语言兼容好
Avro 行式,支持 schema 演进

环境架构

HiveServer2 / Beeline / Hue
        ↓
   Hive 核心服务
        ↓
  执行引擎(MapReduce / Spark / Tez)
        ↓
    HDFS / HBase

Hive 数据模型

-- 内部表(Managed Table):数据由 Hive 管理,删除表时数据也删除
CREATE TABLE tb_emp (
    empno INT,
    ename STRING,
    job STRING,
    sal DECIMAL(7,2)
) STORED AS ORC;

-- 外部表(External Table):数据由外部管理,删除表时数据保留
CREATE EXTERNAL TABLE tb_emp_ext (
    empno INT,
    ename STRING
) LOCATION '/data/emp/';

-- 分区表(Partitioned Table):按分区字段划分目录
CREATE TABLE tb_sales (
    amount DECIMAL(10,2),
    dt STRING
) PARTITIONED BY (year STRING, month STRING);

-- 分桶表(Bucketed Table):按哈希分桶
CREATE TABLE tb_emp_bkt (
    empno INT, ename STRING
) CLUSTERED BY (empno) INTO 4 BUCKETS;

HiveQL 常用操作

DDL

CREATE DATABASE IF NOT EXISTS warehouse;  -- 建库
SHOW DATABASES;                             -- 查库
USE warehouse;                             -- 切换库
SHOW TABLES;                                -- 查表

DROP TABLE tb_emp;                          -- 删表
TRUNCATE TABLE tb_emp;                      -- 清空数据(Hive 3.0+)

DML

-- 加载数据(从 HDFS 或本地)
LOAD DATA INPATH '/data/emp.csv' INTO TABLE tb_emp;
LOAD DATA LOCAL INPATH '/local/emp.csv' INTO TABLE tb_emp;

-- 查询(与 SQL 基本一致)
SELECT ename, sal FROM tb_emp WHERE sal > 3000;

-- 聚合
SELECT deptno, COUNT(*), AVG(sal)
  FROM tb_emp
 GROUP BY deptno;

-- 高级函数(Hive 支持更多函数)
SELECT row_number() OVER (PARTITION BY deptno ORDER BY sal DESC) rn,
       ename, sal
  FROM tb_emp;

常用函数

函数 说明
row_number / rank / dense_rank 窗口排名
collect_set / collect_list 分组收集
explode 炸裂数组/Map
concat_ws / split 字符串操作
unix_timestamp / from_unixtime 时间戳转换
json_tuple / get_json_object JSON 解析

Python 操作 Hive(PyHive)

from pyhive import hive

conn = hive.connect(host='localhost', port=10000,
                    username='hive')
cursor = conn.cursor()

cursor.execute('SELECT * FROM tb_emp WHERE sal > 3000')
for row in cursor.fetchall():
    print(row)

conn.close()

总结

  • Hive = SQL 解析层 + 执行引擎(MR/Spark/Tez) + 存储层(HDFS)
  • 外部表:数据不归 Hive 管;内部表:数据由 Hive 管理
  • 分区:按字段划分子目录,提升查询效率
  • 分桶:按哈希划分,减少 JOIN 时的数据倾斜
  • 存储格式推荐 ORCParquet