2015-11-04 85 views
2

继续问题:What is the difference between partitioning and bucketing a table in Hive ?蜂巢桶vs分区

假设我们已通过Salary列对员工表进行分区。如果我们使用基于salary列的where子句中的条件从此表编写select查询,那么查询将运行得很快......因为它只会从特定分区获取细节。

但是,如果我们根据薪水栏和固定桶数设置相同的表格,而不是分区。那么在这种情况下,如果我们编写相同的查询,我想知道该查询如何从桶中受益?任何人都可以解释吗?

回答

0

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

试想一个表

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

我们不是工资,而是由雇员分时段的,使得每个员工放在有点随机分为桶。我们可以说,统计上可能的是,薪资在各个桶中均匀分配。

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

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

正如mattinbits所说,如果您在员工ID而不是薪水上分流,分段将会更有用。

和水桶的数量可以保持在2像2,4,8,16,32电源...

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

并且当您在同一列上使用具有存储桶的其他表的联接时,使用与此表的存储桶数相同或多个存储桶的数量的存储桶,则联接会发生在存储器中,或者可以说地图边加入,这是更快..

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