join的一些总结

667 阅读2分钟

hash join

  • 等值join中,hash join使用较广 image.png 在分布式中,可以改造为下面俩种

broadcast hash join

  • 将其中一张较小的表通过广播的方式,由driver发送到各个executor,大表正常被分成多个区,每个分区的数据和本地的广播变量进行join(相当于每个executor上都有一份小表的数据,并且这份数据是在内存中的,过来的分区中的数据和这份数据进行join)。broadcast适用于表很小,可以直接被广播的场景;

image.png

shuffle hash join

  • 一旦小表比较大,此时就不适合使用broadcast hash join了。这种情况下,可以对两张表分别进行shuffle,将相同key的数据分到一个分区中,然后分区和分区之间进行join。相当于将两张表都分成了若干小份,小份和小份之间进行hash join,充分利用集群资源。

Bucket Shuffle Join

  • 这是doris独有的join
  • 实际上,是shuffle join的特例,如果join命中了表的分布列(即分桶的列),这时候将另一个表按照该 桶的key来hash然后发送到对应的桶的节点,减少了io

image.png

sort merge join

image.png 这个是spark里面对俩个大表的join的一种策略

和 Shuffle Hash Join 的区别是 都有shuffle,但是具体比较的时候一个是使用了hash table,一个因为做了sort,所以直接左右互为驱动表扫描一次即可!!

Cartesian Join

是spark中的笛卡尔join

Broadcast Nested Loop Join

就是嵌套俩层循环,只不过将小表广播了一次 效率特别底下

image.png

colocate join

image.png

ck join

ck单机join基本上是hash join 分布式join有一些技巧,问题

image.png

image.png

注:仅是自己的一些学习总结,截图了一些别的博客

blog.bcmeng.com/post/doris-…

blog.csdn.net/weixin_3999…

blog.csdn.net/weixin_3999…

blog.bcmeng.com/post/doris-…