Hive buckets vs Partitioning

时间:2015-11-04 12:10:12

标签: hive

继续提问:What is the difference between partitioning and bucketing a table in Hive ?

假设我们已按Salary列对employee表进行了分区。如果我们从这个表中用一个基于salary列的where子句中的条件编写一个select查询,那么查询将运行得很快..因为它只会从特定分区中获取详细信息。

但是,如果我们根据工资列存储相同的表并设置固定存储桶数量,而不是分区。那么在这种情况下,如果我们编写相同的查询,我想知道该查询将如何受益于桶?有人可以解释一下吗?

2 个答案:

答案 0 :(得分:2)

分组的一个用例是快速采样数据。

想象一个表

CREATE TABLE employee(employeeId String, salary Double) 
CLUSTERED BY(user_id) INTO 10 BUCKETS;

我们不是通过薪水而是通过employeeId,因此每个员工都被随机地放入一个桶中。我们可以说,从统计上来说,工资在整个水桶中的分配相当均匀。

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

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

答案 1 :(得分:1)

正如mattinbits所说的那样,如果你使用员工ID而不是薪水,那么分组会更有用。

并且桶的数量可以保持为2的幂,如2,4,8,16,32 ......

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

当你在同一列上使用另一个具有桶的表的连接时,有多个桶与该表的桶数相同或多个,那么连接发生在内存中,或者你可以说map side join,这要快得多..

你应该在你使用很多where子句时选择分区,在同一列(分区列)上,分区列的一个好候选者可以是:州,城市,国家,年,月,部门,