一个简单的 join 的例子,目的是获取 60 岁以上用户花费大于 1000 的详细信息,由于年纪和花费在两张表中,所以此时需要做一次 join。一般来说 join 有哪两种实现方式?
一是 Sorted Merge Join:也就是对于 a 和 b 两个子句执行后的数据按照 join key (userid) 进行分区,然后在下游节点按照相同的 key 进行Merge Join 操作,实现 Merge Join 需要对两张表都要做 shuffle 操作——也就是进行一次数据交换,特别的如果有数据倾斜(例如某个 userid 对应的交易记录特别多),这时候 MergeJoin 过程就会出现长尾,影响执行效率;
二是 Map join (Hash join) 的方式:上述 sql 中如果 60 岁以上的用户信息较少,数据可以放到一个计算节点的内存中,那对于这个超小表可以不做 shuffle,而是直接将其全量数据 broadcast 到每个处理大表的分布式计算节点上,大表不用进行 shuffle 操作,通过在内存中直接建立 hash 表,完成 join 操作,由此可见 map join 优化能大量减少 (大表) shuffle 同时避免数据倾斜,能提升作业性能。但是如果选择了 map join 的优化,执行过程中发现小表数据量超过了内存限制(大于 60 岁的用户很多),这个时候 query 执行就会由于 oom 而失败,只能重新执行。
以上内容摘自《“伏羲”神算》电子书,点击https://developer.aliyun.com/topic/download?id=873
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。