一文解析大数据的JOIN

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 本文大部分理论和问题都从maxcomputer中得出,不同的计算引擎底层结构不同最后结果可能稍微不同,这一点需要注意,本文应该可以让你不再苦恼各种join,或者更加苦恼join。

本文大部分理论和问题都从maxcomputer中得出,不同的计算引擎底层结构不同最后结果可能稍微不同,这一点需要注意,本文应该可以让你不再苦恼各种join,或者更加苦恼join。

老生常谈的大小表问题

和传统sql语句类比,maxcomputer下的左右连接很奇怪,在官方文档中写着,碰到大小表问题,需要将大表放左边,小表放右边,和我们所理解的大小表问题的处理方式正好相反。

为了验证这一原因,我用一份两千万数据的大表和一份三万条数据的小表进行测试,为了避免数据泄露,本次测试包括下面全部测试样例都使用了CTE表达式。

正常的LEFTJOIN

首先说结果大表leftjoin小表,任务耗时3537ms,小表leftjoin大表,任务耗时4412ms。

从自带的logview查看二者的fuxijob,可以看出大表在右的时候,maxcomputer会采用hashjoin的方式直接将小表的数据和大表的数据关联;而当小表在右的时候,maxcomputer则会比正常多一步,既将两个数据流进行mergejoin,前者是将小表数据写入内存中进行join,后者则是排序join,耗时原因也就找到了。

排序后的LEFTJOIN

可实际业务中却也会出现左侧表为小表的情况,比如我们拿订单主表来关联订单子表的数据,如果提前以关联键排序,理论上来说,mergejoin会比hashjoin快一些,实际情况呢?

大表leftjoin小表,任务耗时6656ms,小表leftjoin大表,任务耗时4878ms,这真是可喜可贺,既然不能提升自己,那就打压一下对手,这里就不得不吐槽一下,一般大表在前,小表在后,是用大表卡小表的数据,用mapjoin中的join来指定大小表即可,为何要把其放在默认的逻辑上,反而是小表在前,会出现不用小表卡大表数据的情况。

这里也可能是本人接触的业务导致的偏见,继续聊join。

指定的MAPJOIN

maxomputer支持的mapjoin为左右连接和内连接,不支持全连接,但即使用mapjoin,leftouterjoin的时候左侧表也必须是大表,rightouterjoin相反,右侧为大表,innerjoin则可以显示指定何为小表,所以这里仅仅测试innerjoin的区别。

大表leftouterjoin小表,任务耗时7315ms,小表leftouterjoin大表,任务耗时8803ms;二者都是进行hashjoin,任务也只有两个M一个R,前者速度慢的原因,可能是我先查的后者,前者部分数据是从高速缓存读取的原因。

作为参考项,这里不使用mapjoin,单独join出了一份数据。大表leftouterjoin小表,任务耗时1499ms,小表leftouterjoin大表,任务耗时906ms;不用大惊小怪,因为maxcomputer有个类似oracle高速缓存的东西,也可以保存几次语义树解析相同的数据,需要的时候,直接拿出来。

为了进一步测试,过了一天后,我重新测试了非mapjoin的情况下,join的情况,大表在右时耗时7211ms,而小表在右则为8482ms.

到这里,大小表问题就告一段落,得出的结论也很简单,那就是大表在前,小表在后,如果数据需要出排序的数据,则可以提前排序,来让大小表的关系反过来,mapjoin的使用可有可无,基本上不是为了能够在关联的时候使用不等值表达式或者or逻辑,则可以舍弃mapjoin,其性能并不会因为使用了复杂的语法而多突出。

花里胡哨的JOIN

除了左右连接,内连接和隐式连接外,maxcomputer还提供了好几种花里胡哨的join,虽然可用性很低,但到了该使用的时候,也能带来不少的感官提升。

自然连接

作为自然连接,natutal join并不算稀奇,但他在odps sql的出现,不仅可以让开发少写几行代码,还可以让后来者在查看代码时,感到无地自容,这人的代码好牛逼,虽然只是sql,但我不知道他的关联是如何实现的。

其本质就是可以不去写on语句,只需要写natural join,执行时会自动根据左右表相同名称的字段进行inner join的操作。

半连接

半连接semi join,又一种朴实无华的join,其可以写为left semi join,可以返回左表满足右表指定条件的数据,和in相同;也可以写left anti join,可以返回左表不满足右表指定关联条件的数据,和not in相同。

IN和JOIN的效率

为了验证in和semi join在maxcomputer的执行效率,我用一张分区表进行了测试,大表数据大约1个g的数据量,小表数据为其一个分区有600多m的数据量,为了控制变量,在with阶段,我只选用了用户字段作为大小表数据,第一次semi join耗时3608ms,会有两个map任务,然后执行一个merge join任务,最后是有个reduce任务。

但在执行in的时候,语句进入resultcache直接得出结果,我在这里理解为二者经过优化后,实际执行的效率是相同的。

为了进一步测试,我用其他日期分区的再次进行in查询,发现执行为3517ms,查看job,发现in也是两个map任务,一个mergejoin任务,一个reduce任务,进一步验证了我的猜想。

这一理论也可以相应的延伸到其他的mapreduce为底层的sql语句,关系型数据库in比join慢是因为会创建临时表等操作,mapreduce并不会。

当然,我这里推荐使用的依旧还是semijoin,虽然可读性会差一些,只不过后续调整会方便很多,而且写的字数也比写in更少,效率就是王道!

Distributed MapJoin

分布式mapjoin(Distributed MapJoin),其为mapjoin的升级版,适合用作小表join大表的场景,不过核心都是减少大表侧的shuffle和排序操作。

只不过这个大小表有额外的定义,就是小表都得是在1g以上100g以下的数据,大表则是在10t以上的数据,这着实有点离大谱,目前本人还没有接触过这么大量级的表。

可以通过设置shard_count控制小表数据分片数,让小表数据分片(推荐一个分片量级为200m到500m)到各个计算节点处理;还可以通过replica_count控制小表数据的副本数,减少访问压力和避免节点失效后的整个任务失败,毕竟这一个任务跑起来消耗的资源可不少。

distmapjoin的真正使用场景,目前我无法想出来,但估计会发生的dws层,业务有一张大的维表和一张多数据源组层的dwd宽表。

SKEWJOIN HINT

sql join的时候有可能出现数据分布不均匀导致的长尾问题,skew join可以获取表的热点key,然后分别计算热点数据和非热点数据,加快执行效率。

显式指定和不指定的区别就在于,效率会更高,也就是方法三比方法一更快,方法二则居中。

当然,如果没有热点问题建议不要使用,它会让你的执行效率从3000ms变成10000ms,因为它的本质就是将热点数据和非热点数据打散,然后再unionall在一起。

动态过滤器

动态过滤器(dynamic filter)说是join的一种方式,反而不如说是一种join优化的思路,shuffle操作在海量数据下消耗的资源和时间都很多。

能够在join之前,将数据提前过滤掉的操作就被称为动态过滤器,官方文档中给出的思路是将小表侧的最小值和最大值得出,发送到大表侧,然后过滤掉大表侧的数据,规定中左侧为小表,而右侧为大表,但maxomputer定义join的时候,却是大表在左侧小表在右侧。

开启动态过滤器测试,发现他确实指定的small_table为小表,然后拿小表的最大值最小值去卡大表的数据,当大小表位置更换后则会报错。

官方文档也确实有如下内容(生产者为小表,消费者为大表,指大表消费小表生产的最大值最小值):

对于不同类型的JOIN语义,JOIN对象可担任的角色不同:

  • A JOIN B:A或B都能作为生产者、消费者。
  • A LEFT JOIN B:A只能作为生产者,B只能作为消费者。
  • A RIGHT JOIN B:A只能作为消费者,B只能作为生产者。
  • A FULL OUTER JOIN B:无法使用动态过滤器功能。

不懂就问,有大佬可以解释一下,为什么动态过滤器打开后,大小表的关系就反过来了?还是我测试的时候出现什么问题?

上面的思路和join方式套用在其他以mapreduce为基底的join上也是通用的.,当然就像我最后卡了bug一样,一段sql并不仅仅是写完就结束,他应该是优美的,尽自己可能优化过的。

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
1月前
|
机器学习/深度学习 供应链 大数据
【2023Mathorcup大数据】B题 电商零售商家需求预测及库存优化问题 python代码解析
本文提供了2023年MathorCup大数据竞赛B题的电商零售商家需求预测及库存优化问题的Python代码解析,涉及数据预处理、特征工程、时间序列预测、聚类分析以及模型预测性能评价等步骤。
82 0
|
26天前
|
存储 机器学习/深度学习 数据采集
深入解析大数据核心概念:数据平台、数据中台、数据湖与数据仓库的异同与应用
深入解析大数据核心概念:数据平台、数据中台、数据湖与数据仓库的异同与应用
|
26天前
|
存储 缓存 NoSQL
深入解析Memcached:内部机制、存储结构及在大数据中的应用
深入解析Memcached:内部机制、存储结构及在大数据中的应用
|
1月前
|
机器学习/深度学习 算法 大数据
【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A:基于计算机视觉的坑洼道路检测和识别 python 代码解析
本文提供了2023年MathorCup高校数学建模挑战赛大数据竞赛赛道A的解决方案,涉及基于计算机视觉的坑洼道路检测和识别任务,包括数据预处理、特征提取、模型建立、训练与评估等步骤的Python代码解析。
43 0
【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A:基于计算机视觉的坑洼道路检测和识别 python 代码解析
|
22天前
|
SQL 分布式计算 大数据
"大数据计算难题揭秘:MaxCompute中hash join内存超限,究竟该如何破解?"
【8月更文挑战第20天】在大数据处理领域,阿里云的MaxCompute以高效稳定著称,但复杂的hash join操作常导致内存超限。本文通过一个实例解析此问题:数据分析师小王需对两个共计300GB的大表进行join,却遭遇内存不足。经分析发现,单个mapper任务内存默认为2GB,不足以支持大型hash表的构建。为此,提出三种解决方案:1) 提升mapper任务内存;2) 利用map join优化小表连接;3) 实施分而治之策略,将大表分割后逐一处理再合并结果。这些方法有助于提升大数据处理效率及稳定性。
41 0
|
2月前
|
存储 分布式计算 DataWorks
MaxCompute产品使用合集之如何在代码中解析File类型的文件内容
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
64 11
|
2月前
|
分布式计算 MaxCompute
ODPS问题之右表有重复数据会对Left Join的结果产生什么影响
ODPS问题之右表有重复数据会对Left Join的结果产生什么影响
|
2月前
|
机器学习/深度学习 分布式计算 MaxCompute
ODPS问题之什么是Join/Inner Join
ODPS问题之什么是Join/Inner Join
|
2月前
|
监控 前端开发 SQL
ODPS SQL问题之在何种情况下建议使用Distributed Map Join
ODPS SQL问题之在何种情况下建议使用Distributed Map Join
|
2月前
|
JSON 分布式计算 大数据
MaxCompute产品使用合集之如何解析嵌套的JSON数据
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。

热门文章

最新文章

推荐镜像

更多