Hive 配置单元桶与分区

Hive 配置单元桶与分区,hive,Hive,继续提问: 假设我们已按薪资列对employee表进行了分区。如果我们在此表中编写一个select查询,其中where子句中的条件基于salary列,那么查询将快速运行。。因为它只能从特定分区获取详细信息 但是,如果我们基于salary列对同一个表进行bucket,并设置固定的bucket数,则不需要分区。那么在本例中,如果我们编写相同的查询,我想知道该查询如何从bucket中获益??有人能解释一下吗?bucketing的一个用例是数据的快速采样 想象一张桌子 CREATE TABLE empl

继续提问:

假设我们已按薪资列对employee表进行了分区。如果我们在此表中编写一个select查询,其中where子句中的条件基于salary列,那么查询将快速运行。。因为它只能从特定分区获取详细信息


但是,如果我们基于salary列对同一个表进行bucket,并设置固定的bucket数,则不需要分区。那么在本例中,如果我们编写相同的查询,我想知道该查询如何从bucket中获益??有人能解释一下吗?

bucketing的一个用例是数据的快速采样

想象一张桌子

CREATE TABLE employee(employeeId String, salary Double) 
CLUSTERED BY(user_id) INTO 10 BUCKETS;
我们不是按工资而是按员工ID来扣减工资,这样每个员工都会被随机放入一个桶中。我们可以说,从统计上看,工资很可能在各个部门分布得相当均匀

如果我们想找出平均工资,我们可以在bucket的子集上运行这个查询,这比在整个数据集上运行查询要快,但给出了一个很好的近似值

Select Average(salary) FROM employee TABLESAMPLE(BUCKET 1 OUT OF 10 ON employeeId);

正如mattinbits所说,如果你根据员工身份证而不是工资来选择薪酬,那么扣工资会更有用

桶的数量可以保持在2的幂次。比如2,4,8,16,32

要决定多少桶,你应该考虑一下。 一个存储桶中的数据量=(数据总大小/存储桶数)<(应小于)内存大小

当您将一个连接与另一个表使用时,另一个表在同一列上有多个存储桶,存储桶的数量与此表的存储桶的数量相同或倍数,那么连接会在内存中发生,或者您可以说是映射端连接,这会快得多

当您将要使用很多where子句时,您应该选择partition,在同一列(分区列)上,分区列的最佳候选列可以是:州、市、国家、年、月、部门、