在大数据分析中,聚合函数是Hive的核心能力之一,用于从海量数据中提取关键统计指标(如总和、均值、排名等)。然而,实际业务场景中可能面临以下挑战:
本文通过6类聚合函数、12个实战案例、企业级调优方案,全面解析Hive聚合操作的原理与应用。
函数 | 描述 | 示例 |
---|---|---|
COUNT() |
统计行数(含NULL) | COUNT(*) 1 |
SUM() |
数值列求和 | SUM(sales) AS total_sales |
AVG() |
数值列均值 | AVG(salary) |
MAX()/MIN() |
最大值/最小值 | MAX(temperature) |
COLLECT_SET() |
返回去重集合(数组) | COLLECT_SET(user_id) 2 |
技术注释
COUNT(*)
统计所有行,COUNT(列名)
排除NULLcollect_set()
函数 | 描述 |
---|---|
GROUPING SETS |
多维度组合聚合(替代多个UNION)1 |
CUBE |
生成所有维度组合的聚合(超集)2 |
ROLLUP |
生成层次化维度聚合(如年→月→日)3 |
NTILE() |
将数据分桶并分配桶编号4 |
PERCENTILE_APPROX() |
近似百分位数计算(适用于大数据)5 |
技术注释
UNION ALL
性能提升3-5倍GROUP BY CUBE(col1, col2)
NTILE(4) OVER(...)
PERCENTILE_APPROX(col, 0.5, 100)
-- 统计每个地区的总销售额与订单数
SELECT region,
SUM(amount) AS total_sales,
COUNT(DISTINCT order_id) AS order_count
FROM sales
GROUP BY region;
避坑:COUNT(DISTINCT)在数据量大时效率低,改用approx_count_distinct近似计算。
-- 同时计算部门、性别及其组合的平均薪资
SELECT dept, gender, AVG(salary) AS avg_salary
FROM employee
GROUP BY dept, gender
GROUPING SETS (dept, gender, (dept, gender), ());
输出结果包含:
-- 按年、月、日层级汇总销售额
SELECT year, month, day, SUM(amount)
FROM sales
GROUP BY ROLLUP (year, month, day);
输出结果包含:
-- 估算每日UV(误差率<1%)
SELECT dt,
approx_count_distinct(user_id) AS uv
FROM user_logs
GROUP BY dt;
优势:比COUNT(DISTINCT)快10倍以上,适合亿级数据。
-- 统计每个部门薪资前3的员工
SELECT dept, emp_name, salary
FROM (
SELECT dept, emp_name, salary,
ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) AS rank
FROM employee
) tmp
WHERE rank <= 3;
-- 计算每月销售额的累计值
SELECT month, amount,
SUM(amount) OVER (ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative
FROM monthly_sales;
-- 处理大Key:user_id = 'U1001'
SELECT user_id, SUM(amount)
FROM (
SELECT
CASE WHEN user_id = 'U1001' THEN CONCAT(user_id, '_', FLOOR(RAND()*10))
ELSE user_id END AS user_id,
amount
FROM sales
) tmp
GROUP BY user_id;
-- 提升聚合性能参数
SET hive.map.aggr = true; -- Map端预聚合
SET hive.groupby.skewindata = true; -- 数据倾斜自动优化
SET hive.tez.exec.print.summary=true; -- 启用Tez引擎加速
业务需求 | 推荐函数 |
---|---|
精确去重统计 | COUNT(DISTINCT) + 分桶表1 |
大数据量近似计算 | approx_count_distinct /PERCENTILE_APPROX 2 |
多维交叉分析 | CUBE /GROUPING SETS 3 |
实时累计计算 | 窗口函数(SUM() OVER )4 |
技术注释
CLUSTERED BY
列使用,降低数据倾斜UNION ALL
实现多维度聚合,性能提升5倍+ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
架构搭建:
中小型企业大数据平台全栈搭建:Hive+HDFS+YARN+Hue+ZooKeeper+MySQL+Sqoop+Azkaban 保姆级配置指南
大数据入门:大数据(1)大数据入门万字指南:从核心概念到实战案例解析
Yarn资源调度文章参考:大数据(3)YARN资源调度全解:从核心原理到万亿级集群的实战调优
Hive函数汇总:Hive函数大全:从核心内置函数到自定义UDF实战指南(附详细案例与总结)
Hive函数高阶:累积求和和滑动求和:Hive(15)中使用sum() over()实现累积求和和滑动求和
Hive面向主题性、集成性、非易失性:大数据(4)Hive数仓三大核心特性解剖:面向主题性、集成性、非易失性如何重塑企业数据价值?
Hive核心操作:大数据(4.2)Hive核心操作实战指南:表创建、数据加载与分区/分桶设计深度解析
Hive基础查询:大数据(4.3)Hive基础查询完全指南:从SELECT到复杂查询的10大核心技巧
Hive多表JOIN:大数据(4.4)Hive多表JOIN终极指南:7大关联类型与性能优化实战解析