当前位置: 代码迷 >> 综合 >> 浅谈bucket x out of y on condition
  详细解决方案

浅谈bucket x out of y on condition

热度:88   发布时间:2023-12-04 12:25:56.0

首先,我们先来理解"X"表达的是什么 

       这里的"x"表达的是在把原本的桶分成 份后的顺序的第 个,来个简单的例子:例如有个表被分成了4个buckets,那么这个时候运行 bucket 1 out of  4 on id(我们暂时默认以id分),这句话表示就是把原本的buckets分成4份,取第一份的数据,即取第一桶的数据。到这里只是最简单的形式。

然后我们来看"Y" 表达的是什么

此时可以分为两类:1.Y>buckets的数目    2.Y<buckets的数目

结合x一起来看第一种情况:假设buckets数目有4个,Y=8,x=2

那么这时候很明显只有4个不够8个,这时候它会切分成8份,简单来说会把每一个bucket平均分成两份。下面重点来了,这8个会怎么排序呢? (我简单的画个草图)

他会形成A1,B1 , C1 , D1 , A2 , B2 , C2 , D2以这样的顺序排序。

可以进行验证的:例如我用bucket 1 out of 4 on id,结果如下(我的表用id分成了4个桶)

 

 

可以看到(截取出来的一个字段信息),很明显这是第一个桶内的信息(参考我上面开头刚说的)

employee_id_buckets3.employee_id  
-----------------------------------
124                                            |
120                         
116                         
112 
108                        
104                            
100   

如果我用bucket 5 out of 8 on id 时,结果如下:

employee_id_buckets3.employee_id  
-----------------------------------
124                                            |
116                         
108                        
100   

这里可以看出这是第一个桶内的部分信息。

再来看看我刚刚用的两条命令

select * from employee_id_buckets3 tablesample(bucket 1 out of 4 on employee_id);
select * from employee_id_buckets3 tablesample(bucket 5 out of 8 on employee_id);

一对比,效果很显然,A2在分成8份时,排序时第五位。

结合x一起来看第二种情况:假设buckets数目有4个,Y=2,x=2

如果你上面搞懂了,这个就很简单了。

这时候bucket会合成2份,也就是参数Y的值。那么这时候要明白他是如何分的:如果我们把4个桶编号成A,B,C,D,

那么会他会从前往后分发,先把份数满足,然后多的,在从头分发,所以形成了AC,BD两份

select * from employee_id_buckets3 tablesample(bucket 1 out of 2 on employee_id);

他会取第一个桶内的数据。就是AC两个桶的数据。

  相关解决方案