跳到主要内容

Hive

问题

什么是 Hive?它和传统数据库有什么区别?

答案

Hive 简介

Hive 是基于 Hadoop 的 SQL 查询引擎,将 SQL 翻译为 MapReduce/Tez/Spark 任务在分布式集群上执行。

对比HiveMySQL
数据规模TB~PBGB~TB
延迟分钟~小时毫秒~秒
存储HDFS本地磁盘
事务有限支持完整 ACID
适用离线分析在线业务

分区与分桶

-- 分区:按日期分目录存储,查询只扫描对应分区
CREATE TABLE dwd.user_action (
user_id BIGINT,
event STRING,
amount DECIMAL(18,2)
)
PARTITIONED BY (dt STRING, hour STRING)
STORED AS ORC; -- ORC 列存格式

-- 查询时指定分区,避免全表扫描
SELECT * FROM dwd.user_action
WHERE dt = '2024-01-15' AND hour = '10';

-- 分桶:按字段 Hash 分文件,加速 JOIN 和采样
CREATE TABLE dim.users (
user_id BIGINT,
username STRING
)
CLUSTERED BY (user_id) INTO 64 BUCKETS
STORED AS ORC;

文件格式对比

格式类型压缩适用
ORC列存Hive 首选
Parquet列存Spark/Presto 首选
Avro行存流式写入
Text/CSV行存临时导入
数据分析师需要知道的
  • 写 SQL 时务必加分区过滤(不加 WHERE dt = ... 可能扫描全量数据)
  • 使用 ORC/Parquet 格式比 Text 快 10x+
  • Hive 适合大规模离线 ETL,不适合交互式分析

常见面试问题

Q1: Hive 的内部表和外部表有什么区别?

答案

  • 内部表:DROP 时删除数据和元数据
  • 外部表:DROP 时只删除元数据,HDFS 数据保留
  • 实践中外部表更安全,防止误删数据

Q2: Hive 查询慢怎么优化?

答案

  1. 加分区过滤(最重要)
  2. 使用 ORC/Parquet 列存格式
  3. 避免 SELECT *,只查需要的列
  4. 大表 JOIN 小表用 MapJoin
  5. 使用 Tez/Spark 引擎替代 MapReduce

相关链接