Hive桶与分区的比较

3

继续上一个问题:Hive中分区和桶的区别是什么?

假设我们按照工资列对员工表进行了分区。如果我们从这个表中编写一个带有where子句的选择查询,该子句基于工资列,则查询将运行快速...因为它只会从特定分区获取详细信息。

然而,与其进行分区,如果我们根据工资列对同一表进行桶操作,并设置固定的桶数。那么在这种情况下,如果我们编写相同的查询,我想知道查询如何从桶中受益? 请问有人能解释一下吗?

2个回答

3

桶操作的一个使用场景是快速对数据进行抽样。

想象一张表格

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

我们根据员工ID来分组而非薪资,这样每个员工都会被随机地分配到一个桶中。我们可以说薪资在桶内的分布是统计意义上均匀的。如果我们想要找出平均薪资,我们可以在子集的桶上运行查询,这比在整个数据集上运行查询更快,但能给出较好的近似值。
Select Average(salary) FROM employee TABLESAMPLE(BUCKET 1 OUT OF 10 ON employeeId);

1

正如mattinbits所说,如果您按员工ID而不是薪水进行分桶,分桶将更有用。

而桶的数量可以保持为2的幂次方。例如2、4、8、16、32...

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

当您与另一个具有相同列上的桶的表进行连接时,其桶的数量与该表的桶的数量相同或是其倍数,则连接会在内存中发生,或者您可以称之为映射端连接,这样速度会更快。

当您将在同一列(分区列)上使用许多where子句时,应选择分区,适合作为分区列的好候选列可能是:州、城市、国家、年份、月份、部门。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接