目前共有五张表,数据量约600G,要做join,没有where条件。我目前做法如下:
create table if not exists tmp1
(
id string,
........
)patition(part_by_hash string)
insert overwrite table tmp1 partition(part_by_hash)
select
id,
...,
hash(id)%1000
from AAA
如上所示,就是先创建5张这样的临时表,将数据按照共同主键的哈希值取模分配到1000个分区里,确保同5张表中相同主键的记录会分配到同一编号的分区里,这样就能先分别对各分区进行join,然后合并起来就是需要的结果。但是我对于这种情况下join语句的写法不太去确定:
select * from tmp1
join tmp2 on tmp1.id=tmp2.id
join tmp3 on tmp1.id=tmp3.id
join tmp4 on tmp1.id=tmp4.id
join tmp5 on tmp1.id=tmp5.id
我是这样写的,效果一般但好歹能跑起来了。但是我觉得应该不会这么简单,但是手头资料有限,对ODPS的原理也不是很了解,请各位大神赐教
1.如果某些join的关联key相同,需按顺序放在一起,提高效率 2. 分析join是否有倾斜,有的话考虑切分热点数据,最后进行union all合并 3. 还可以看看时间是否可切分,不做全表关联,增量关联近xx天数据,补历史数据的情况下,每次运行只刷新近xx天数据
五张表都是大数据表的话,以上语法没有问题;
如果有小表可以考虑mapjoin提高效率;
在join过程中如果有长尾数据,请排查下原因解决即可,看下是空值还是有热点key。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。