概述
- 列裁剪
select后面跟要选择的列,由于hive中数据采用列式存储,选择需要的字段可加快字段的读取、减少数据量。(节省了读取开销,中间表存储开销和数据整合开销) - 分区裁剪
where条件第一个为分区字段, - 多值group by
如果group by后面有多个字段时,将更多值的字段放在前面,如group by有user_id和sex两个字段,应该是group by user_id、sex - order by
order by时尽量使用limit,尽量避免使用order by。Order by需要扫描数据到单个worker节点进行排序,导致单个worker需要大量内存。如果是查询Top N或者Bottom N,使用limit可减少排序计算和内存压力 - 大小表join
Join时将大表放在左边:join时会将左边的表分割到多个worker,然后将join右边的表数据整个复制一份发送到每个worker进行计算。如果右边的表数据量太大,则可能会报内存溢出错误 - union 和 union all
UNION ALL 代替 UNION :不用去重.和distinct的原因类似, UNION有去重的功能, 所以会引发内存使用的问题.如果只是拼接两个或者多个SQL查询的结果, 考虑用UNION ALL - 谓词下推
在子查询中,where条件应当放在子查询内部,而非外部。 - distinct
使用group by代替distinct,当要计算某一列去重数据量时,使用count(distinct)时,速度很慢,原因和order by一样,数据将会在一个reduce中处理,此时可以使用group by语句替代
eg:select count(distinct user_id) from table_name
改为
select count(1) from (select user_id from table_name group by user_id)t;
当然,使用group by时会产生两个MR job,而distinct只会产生一个job,因此当数据量大到启动job的overhead远小于计算耗时,才考虑这种方法。当数据集很小或者key的倾斜比较明显时,group by还可能会比distinct慢。
最后
以上就是高贵小蜜蜂为你收集整理的【Hive】常见优化方法的全部内容,希望文章能够帮你解决【Hive】常见优化方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复