Hive 作为构建在 Hadoop 之上的数据仓库工具,查询性能受存储格式、计算引擎、数据模型、SQL 写法、集群配置等多方面影响。下面从实战角度系统讲一下 Hive 查询优化方法,按「重要性 + 易落地」排序。
STORED AS ORC
TBLPROPERTIES ("orc.compress"="SNAPPY");
✅ 优点:
常用:
SET hive.exec.compress.output=true;
SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
适合时间、地区、业务维度
PARTITIONED BY (dt STRING, region STRING)
✅ 查询时只扫描需要的分区:
WHERE dt='2025-01-01'
适合高基数列(如 user_id)
CLUSTERED BY (user_id) INTO 32 BUCKETS
✅ 好处:
SELECT *-- 不推荐
SELECT * FROM table;
-- 推荐
SELECT user_id, amount FROM table;
-- 推荐
SELECT *
FROM a JOIN b
ON a.id = b.id
WHERE a.dt='2025-01-01';
✅ Hive 会自动下推,但复杂子查询要小心。
SET hive.auto.convert.join=true;
SET hive.mapjoin.smalltable.filesize=25000000;
或显式:
SELECT /*+ MAPJOIN(b) */ *
FROM big a JOIN small b ON a.id=b.id;
-- 错误示例
SELECT * FROM a, b;
SET hive.map.aggr=true;
减少 Shuffle 数据量。
Reduce 1 卡死① 倾斜键随机打散
SELECT
key,
SUM(value)
FROM (
SELECT
CASE WHEN key='xxx' THEN CONCAT(key, rand()) ELSE key END AS key,
value
FROM t
) t1
GROUP BY key;
② 开启倾斜优化
SET hive.groupby.skewindata=true;
SET hive.execution.engine=tez;
-- 或
SET hive.execution.engine=spark;
✅ 比 MapReduce 快很多(尤其多 stage 查询)
SET hive.exec.parallel=true;
SET hive.exec.parallel.thread.number=8;
SET hive.vectorized.execution.enabled=true;
SET hive.vectorized.execution.reduce.enabled=true;
✅ 对 ORC 表效果明显
ANALYZE TABLE table COMPUTE STATISTICS;
ANALYZE TABLE table COMPUTE STATISTICS FOR COLUMNS;
开启 CBO:
SET hive.cbo.enable=true;
SELECT *?Hive 查询优化的本质:少读、少算、少传、并行化
如果你愿意,可以:
我可以帮你做针对性优化方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。