—- 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”)]