Hive的优化主要分为:配置优化、SQL语句优化、任务优化等方案。
其中在开发过程中主要涉及到的可能是SQL优化这块。
优化的核心思想是:
减少数据量(例如分区、列剪裁)避免数据倾斜(例如加参数、Key打散)避免全表扫描(例如on添加加上分区等)减少job数(例如相同的on条件的join放在一起作为一个任务)
HQL语句优化
1、使用分区剪裁、列剪裁
在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤。
select a.*
from test1 a
left join test2 b on a.uid = b.uid
where a.ds='2020-08-10'
and b.ds='2020-08-10'
上面这个SQL主要是犯了两个错误:
副表的过滤条件写在where后面,会导致先全表关联在过滤分区on的条件没有过滤null值的情况,如果两个数据表存在大批量null值的情况,会造成数据倾斜。select a.*
from test1 a
left join test2 b on (d.uid is not null and a.uid = b.uid and b.ds='2020-08-10')
where a.ds='2020-08-10'
如果null值也是需要的,那么需要在条件上转换,或者单独拿出来
select a.*
from test1 a
left join