—- SQL优化——
数据倾斜优化
1.join操作导致的数据倾斜
1)原因
2)优化方法
I.由于表B是个小表并且没有超过512 MB
II.将倾斜的Key用单独的逻辑来处理
2.group by 倾斜
1)原因
2)优化方法
set odps.sql.groupby.skewindata=true
3.错误使用动态分区造成的数据倾斜
1)原因
2)优化方法
不建议使用动态分区,在partition后参数添加静态分区
窗口函数优化
1.原因:通常每个窗口函数会形成一个Reduce作业,如果窗口函数较多,会消耗过多的资源
2.满足条件:
1.窗口函数在OVER关键字后面要完全相同,要有相同的分组和排序条件。
2.多个窗口函数在同一层SQL中执行
子查询优化
1.问题
使用where 后 in语句,导致子查询返回数据量超过1000,出现:records returned from subquery exceeded limit of 1000
2.使用join语句
Join语句优化
where子句优化:
1.主表的分区限制条件可以写在WHERE子句中(最好先用子查询过滤)。
2.主表的WHERE子句建议写在SQL语句最后。
3.从表分区限制条件不要写在WHERE子句中,建议写在ON条件或者子查询中。
—- Join长尾优化—-
MAP JOIN方案
1.原理
2.使用MAPJOIN限制条件
i.MAP JOIN使用时,JOIN中的从表比较小才可用
ii.MAP JOIN使用时,对小表的大小有限制,默认小表读入内存后的大小不能超过512 MB
set odps.sql.mapjoin.memory.max=2048
3.使用方法
在SQL语句中SELECT后加上 / mapjoin(b) /即可,其中b代表小表
JOIN因为空值导致长尾
1.原因:因为空值是无法关联上的,只是分发到了一处
2.解决方案:
可以将空值处理成随机值,随机值既不会影响关联也能避免聚集。
JOIN因为热点值导致长尾
1.原因:因为热点值导致长尾,并且JOIN的输入比较大无法用MAP JOIN
2.解决方案:
i.取出热点Key:将PV大于50000的商品ID取出到临时表。
ii.取出非热点数据
iii.取出热点数据
iiii.将步骤2和步骤3的数据通过union all得到完整的数据
通过设置odps.sql.skewjoin参数解决长尾问题
场景:
1.如果倾斜的值发生变化需要修改代码重新执行命令,且变化无法提前预知
2.如果倾斜值较多也不方便在参数中设置,需要根据实际情况选择拆分代码或者参数设置
操作步骤:
1.开启功能
set odps.sql.skewjoin=true
2.设置倾斜的Key及对应的值
set odps.sql.skewinfo=skewed_src:(skewed_key) [(“skewed_value”)]