hash join
- 等值join中,hash join使用较广
在分布式中,可以改造为下面俩种
broadcast hash join
- 将其中一张较小的表通过广播的方式,由driver发送到各个executor,大表正常被分成多个区,每个分区的数据和本地的广播变量进行join(相当于每个executor上都有一份小表的数据,并且这份数据是在内存中的,过来的分区中的数据和这份数据进行join)。broadcast适用于表很小,可以直接被广播的场景;
shuffle hash join
- 一旦小表比较大,此时就不适合使用broadcast hash join了。这种情况下,可以对两张表分别进行shuffle,将相同key的数据分到一个分区中,然后分区和分区之间进行join。相当于将两张表都分成了若干小份,小份和小份之间进行hash join,充分利用集群资源。
Bucket Shuffle Join
- 这是doris独有的join
- 实际上,是shuffle join的特例,如果join命中了表的分布列(即分桶的列),这时候将另一个表按照该 桶的key来hash然后发送到对应的桶的节点,减少了io
sort merge join
这个是spark里面对俩个大表的join的一种策略
和 Shuffle Hash Join 的区别是 都有shuffle,但是具体比较的时候一个是使用了hash table,一个因为做了sort,所以直接左右互为驱动表扫描一次即可!!
Cartesian Join
是spark中的笛卡尔join
Broadcast Nested Loop Join
就是嵌套俩层循环,只不过将小表广播了一次 效率特别底下
colocate join
ck join
ck单机join基本上是hash join 分布式join有一些技巧,问题