开发者社区> 问答> 正文

请教ODPS上多张表join的性能优化问题

目前共有五张表,数据量约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的原理也不是很了解,请各位大神赐教

展开
收起
剑鱼闯天涯 2017-05-18 23:53:53 8229 0
2 条回答
写回答
取消 提交回答
  • 1.如果某些join的关联key相同,需按顺序放在一起,提高效率 2. 分析join是否有倾斜,有的话考虑切分热点数据,最后进行union all合并 3. 还可以看看时间是否可切分,不做全表关联,增量关联近xx天数据,补历史数据的情况下,每次运行只刷新近xx天数据

    2021-03-31 19:19:35
    赞同 展开评论 打赏
  • 五张表都是大数据表的话,以上语法没有问题;
    如果有小表可以考虑mapjoin提高效率;
    在join过程中如果有长尾数据,请排查下原因解决即可,看下是空值还是有热点key。

    2019-07-17 21:11:32
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
DataWorks调度任务迁移最佳实践-2020飞天大数据平台实战应用第一季 立即下载
DataWorks商业化资源组省钱秘籍-2020飞天大数据平台实战应用第一季 立即下载
基于DataWorks数据服务构建疫情大屏-2020飞天大数据平台实战应用第一季 立即下载