带你读《2022技术人的百宝黑皮书》——ODPS SQL优化总结(2) https://developer.aliyun.com/article/1247149?groupCode=taobaotech
窗口函数的使用
可以通过 row_number()/rank() over(partition by order by )的方式实现数据按照某个字段分组的排序,也可以通过 max(struct())的方式实现。
关联
左关联、内关联、右关联、left anti join 、left semi join等,可以实现不同情况下的多表关联。关联字段要确保字段类型的一致。
笛卡尔积的应用
有时会存在把一行数据翻N倍的诉求,这时候可以考虑自己创建一个维表,通过笛卡尔积操作;同时也可以通过LATERAL VIEW POSEXPLODE(split(REGEXP_REPLACE(space(end_num -start_num+1),' ','1,'),',')) t AS pos ,val的方式。
数据倾斜问题
大表关联小表
大表关联小表出现倾斜时,可以使用mapjoin的hint(/*+mapjoin(b)*/)。
同时可适当调整mapjoin中小表的内存大小:
set odps.sql.mapjoin.memory.max=512;默认512,单位M,[128,2048]之间调整。
大表关联大表
一种情况,大表中存在热点key:可以考虑对大表进行拆分,根据join的key,把热点的数据拆出来走mapjoin,其余的考虑普通join即可。当然也有skewjoin的hint可以参考使用。
另一种情况,大表中不存在热点key:可以考虑在分区的基础上加上桶,对关联字段进行分桶,减少shuffle的数据量。
count distinct
常见的数据倾斜还有一种情况是因为使用了count distinct,这种情况可以考虑使用group by先进行数据去重,再count。
odps新特性
可以关注MaxCompute(ODPS2.0)重装上阵系列文章,很多心得特性对于我们的性能优化有很大的帮助。
带你读《2022技术人的百宝黑皮书》——ODPS SQL优化总结(4) https://developer.aliyun.com/article/1247146?groupCode=taobaotech