Bucket join 用户指南
什么时候我们需要一个bucket table?
如果表满足以下条件,则考虑将其构建为桶表:
- table很大,例如,table size 超过500GB
- 对于小表来说,只有当它用来与一个巨大的桶表连接时,才会出现这种情况。
- Sort Merge Join慢的原因是因为shuffle,而不是数据倾斜
如何选择桶字段?
如果你真的需要构建一个bucket table,在大多数情况下,你不需要。
选择正确的keys ,with high cardinality
如何选择Sort By columns?
Bucket columns 和 日期 类似的列 , 可以帮助跳过 filter 中的数据。或者干脆让Sort By column空着。
我们为什么需要bucket join?
我们知道,在Spark中的查询执行中,最重的操作符是shuffle。通过shuffle,我们可以确保不同任务得到相同的值,这是聚合和join执行的前提。对于某些表,连接模式或聚合模式是固定的。Spark并没有在每次执行中都进行洗牌,而是提供了一种实现洗牌结果的方法,即bucket。通过bucket join,不仅可以避免shuffle,有时还可以避免排序。
如何利用bucket join?
一对一 bucket join
-
连接键与两边的桶键完全匹配 -
两边的桶数相等
-
案例1 Table a(a1,a2,a3) clustered by(a1) sorted by (a1) bucket number n;
Table a(b1,b2,b3) clustered by(b1) sorted by (b1) bucket number n;
Table a join table b on(a1=b1)
一对多 bucket join
- 连接键与两边的桶键完全匹配
- 一边的桶数是另一边的数倍
-
案例1 Table a(a1,a2,a3) clustered by(a1) sorted by (a1) bucket number n;
Table a(b1,b2,b3) clustered by(b1) sorted by (b1) bucket number kn;
Table a join table b on (a1=b1)
Bucket columns are the subset of join keys (Bucket列是连接键的子集)
- 桶键是两边或一边连接键的子集
- 两边的桶数相等
-
案例: Table a(a1,a2,a3) bucket by (a1,a3) bucket number n;
Table a(b1,b2,b3) bucket by (b1,b3) bucket number n;
Table a join table b on (a1=b1,a2=b2,a3=b3)
|