Hive 查询优化是一个比较大的话题,通常可以从表设计、查询写法、参数配置、执行引擎几个层面来做。下面按实战优先级给你一个较系统的总结。
STORED AS ORC
TBLPROPERTIES ("orc.compress"="SNAPPY")
PARTITIONED BY (dt STRING)
CLUSTERED BY (user_id) INTO 32 BUCKETS
-- 不好
SELECT * FROM t;
-- 好
SELECT user_id, amount FROM t;
-- 推荐
SELECT *
FROM a
JOIN b ON a.id = b.id
WHERE a.dt = '2024-01-01';
SELECT user_id FROM t GROUP BY user_id;
SET hive.auto.convert.join=true;
复杂逻辑拆开,避免重复扫描
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;
SET mapreduce.job.reduces=200;
SET hive.exec.compress.intermediate=true;
SET hive.exec.compress.output=true;
SET hive.execution.engine=tez;
-- 或
SET hive.execution.engine=spark;
WHERE user_id IS NOT NULL
SELECT *
FROM a
JOIN b
ON a.id = b.id
AND CASE WHEN a.id = 'hot' THEN rand() ELSE 0 END = 0
SET hive.optimize.skewjoin=true;
ANALYZE TABLE 收集统计信息ANALYZE TABLE t COMPUTE STATISTICS;
SET hive.merge.mapfiles=true;
如果你愿意,可以:
我可以帮你做针对性优化建议。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。