作者:MetaTrade

Hive SQL优化思路分享

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

lock