目录
-
-
- 背景
- 一、Hive基础查询核心语法
-
- [1. 基础查询(SELECT & FROM)](#1. 基础查询(SELECT & FROM))
- [2. 条件过滤(WHERE)](#2. 条件过滤(WHERE))
- [3. 聚合与分组(GROUP BY & HAVING)](#3. 聚合与分组(GROUP BY & HAVING))
- [4. 排序与限制(ORDER BY & LIMIT)](#4. 排序与限制(ORDER BY & LIMIT))
- 二、复杂查询实战技巧
-
- [1. 多表关联(JOIN)](#1. 多表关联(JOIN))
- [2. 子查询(Subquery)](#2. 子查询(Subquery))
- [3. 集合操作(UNION & UNION ALL)](#3. 集合操作(UNION & UNION ALL))
- [4. 窗口函数(ROW_NUMBER)](#4. 窗口函数(ROW_NUMBER))
- 三、10大实战案例
- 四、避坑指南
-
- [1. 常见错误](#1. 常见错误)
- [2. 性能优化](#2. 性能优化)
- [3. 数据格式陷阱](#3. 数据格式陷阱)
- 五、总结
-
背景
在大数据处理中,Hive作为基于Hadoop的数据仓库工具,通过类SQL语法(HiveQL)实现了对海量数据的便捷分析。掌握Hive基础查询语句是数据工程师的核心技能,涉及以下场景:
- 数据筛选:通过SELECT、WHERE快速提取目标数据。
- 聚合分析:利用GROUP BY、HAVING实现数据统计。
- 多表操作:通过JOIN关联不同数据源,UNION合并数据集。
- 结果优化:结合分区、分桶设计提升查询性能。
本文将通过语法解析、10个实战案例及避坑指南,系统讲解Hive基础查询的核心操作。
一、Hive基础查询核心语法
1. 基础查询(SELECT & FROM)
sql
-- 查询所有字段
SELECT * FROM employee;
-- 查询指定字段并重命名
SELECT emp_id AS id, emp_name, salary * 0.9 AS tax_salary
FROM employee;
2. 条件过滤(WHERE)
sql
-- 数值条件
SELECT * FROM sales WHERE amount > 1000;
-- 字符串条件(LIKE)
SELECT * FROM user WHERE name LIKE 'John%';
-- 多条件组合(AND/OR)
SELECT * FROM logs
WHERE status = 'ERROR' AND (url LIKE '/api/%' OR url LIKE '/admin/%');
3. 聚合与分组(GROUP BY & HAVING)
sql
-- 统计每个部门的平均薪资
SELECT dept_id, AVG(salary) AS avg_salary
FROM employee
GROUP BY dept_id
HAVING AVG(salary) > 5000;
4. 排序与限制(ORDER BY & LIMIT)
sql
-- 按薪资降序排序,取前10条
SELECT emp_name, salary
FROM employee
ORDER BY salary DESC
LIMIT 10;
二、复杂查询实战技巧
1. 多表关联(JOIN)
sql
-- 内连接(获取员工及其部门信息)
SELECT e.emp_name, d.dept_name
FROM employee e
JOIN department d ON e.dept_id = d.dept_id;
-- 左外连接(保留未匹配部门的员工)
SELECT e.emp_name, d.dept_name
FROM employee e
LEFT JOIN department d ON e.dept_id = d.dept_id;
2. 子查询(Subquery)
sql
-- 查询薪资高于部门平均薪资的员工
SELECT emp_name, salary
FROM employee
WHERE salary > (
SELECT AVG(salary)
FROM employee
GROUP BY dept_id
HAVING dept_id = employee.dept_id
);
3. 集合操作(UNION & UNION ALL)
sql
-- 合并两个表的数据(去重)
SELECT product_id FROM orders_2022
UNION
SELECT product_id FROM orders_2023;
-- 合并数据(保留重复)
SELECT product_id FROM orders_2022
UNION ALL
SELECT product_id FROM orders_2023;
4. 窗口函数(ROW_NUMBER)
sql
-- 按部门分组,为每个员工生成薪资排名
SELECT emp_name, dept_id, salary,
ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rank
FROM employee;
三、10大实战案例
案例1:查询最新分区数据
sql
SELECT * FROM logs
WHERE dt = '2023-10-01'
LIMIT 100;
案例2:统计每日活跃用户数
sql
SELECT dt, COUNT(DISTINCT user_id) AS active_users
FROM user_activity
GROUP BY dt;
案例3:查询销售额最高的商品类别
sql
SELECT category, SUM(amount) AS total_sales
FROM sales
GROUP BY category
ORDER BY total_sales DESC
LIMIT 1;
案例4:分页查询(模拟OFFSET)
sql
SELECT * FROM employee
ORDER BY emp_id
LIMIT 10 OFFSET 20; -- 第3页(每页10条)
案例5:处理NULL值(COALESCE)
sql
SELECT emp_name, COALESCE(salary, 0) AS salary
FROM employee;
案例6:时间范围查询
sql
SELECT * FROM logs
WHERE log_time BETWEEN '2023-10-01 00:00:00' AND '2023-10-01 23:59:59';
案例7:正则表达式过滤(RLIKE)
sql
SELECT * FROM user
WHERE email RLIKE '^[a-zA-Z0-9._%+-]+@gmail\\.com$';
案例8:动态分区插入查询结果
sql
INSERT INTO TABLE logs_partitioned
PARTITION (dt)
SELECT ip, url, dt FROM raw_logs;
案例9:分桶表JOIN优化
sql
SELECT a.user_id, b.order_amount
FROM user_bucketed a
JOIN orders_bucketed b
ON a.user_id = b.user_id;
案例10:复杂嵌套查询
sql
SELECT dept_id, emp_name
FROM employee
WHERE dept_id IN (
SELECT dept_id
FROM department
WHERE location = 'Shanghai'
);
四、避坑指南
1. 常见错误
忽略NULL值:聚合函数(如COUNT)默认排除NULL,需用COUNT(*)统计所有行。
分区过滤失效:未在WHERE中指定分区字段导致全表扫描。
JOIN数据倾斜:大表JOIN小表未使用MapJoin优化,导致性能问题。
2. 性能优化
使用分区字段过滤:减少数据扫描量。
**避免SELECT ***:仅查询必要字段,降低IO开销。
启用向量化查询:SET hive.vectorized.execution.enabled=true;
3. 数据格式陷阱
TEXTFILE性能低:优先使用ORC/Parquet列式存储。
压缩算法选择:ORC表推荐使用SNAPPY压缩。
五、总结
查询场景 | 推荐语法 | 优化建议 |
---|---|---|
简单数据筛选 | SELECT + WHERE | 结合分区字段过滤 |
聚合统计 | GROUP BY + HAVING | 预聚合中间结果 |
多表关联 | JOIN 或 MAPJOIN | 小表加载到内存 |
分页查询 | LIMIT + OFFSET | 避免深分页(使用ROW_NUMBER) |
复杂逻辑 | 子查询或CTE(Common Table Expression) | 拆分步骤提升可读性 |
实践
- 数据格式:优先使用ORC/Parquet存储格式。
- 分区设计:按时间、地域等业务逻辑分区。
- 避免全表扫描:在WHERE中明确分区条件。
大数据相关文章(推荐)
-
架构搭建:
中小型企业大数据平台全栈搭建:Hive+HDFS+YARN+Hue+ZooKeeper+MySQL+Sqoop+Azkaban 保姆级配置指南 -
大数据入门 :大数据(1)大数据入门万字指南:从核心概念到实战案例解析
-
Yarn资源调度文章参考 :大数据(3)YARN资源调度全解:从核心原理到万亿级集群的实战调优
-
Hive函数汇总 :Hive函数大全:从核心内置函数到自定义UDF实战指南(附详细案例与总结)
-
Hive函数高阶:累积求和和滑动求和 :Hive(15)中使用sum() over()实现累积求和和滑动求和
-
Hive面向主题性、集成性、非易失性 :大数据(4)Hive数仓三大核心特性解剖:面向主题性、集成性、非易失性如何重塑企业数据价值?