在 Hive 中,分区快还是分桶快?

Posted

技术标签:

【中文标题】在 Hive 中,分区快还是分桶快?【英文标题】:In hive ,is partitioning fast or bucketization fast? 【发布时间】:2018-03-09 18:39:04 【问题描述】:

这是我面临的面试问题,如果我们在 HDFS 中有 1 TB 数据。 哪种类型的方法在 hive 中为我们提供了更快的性能,即 partitioningbucketing ? 我根据我们选择partitioningbucketing的数据告诉他们。但是面试官对我的回答并不满意。

什么应该是正确的答案(连同例子)?

【问题讨论】:

【参考方案1】:

您的回答是正确的 - 这实际上取决于数据以及您想要对数据做什么。

Partitioning 用于以逻辑方式水平分布负载。它优化了性能,但有时它可能导致分区中的数量非常少。这会导致性能下降,因为 mapreduce 处理的文件比许多小文件大。

在这里,bucketing 可以提供帮助,因为bucketing 保证桶列的所有数据保持在一起。例如。如果我们对employee 表进行分桶并使用emp_id 作为分桶列,则该列的值将由用户定义的桶数进行散列(必须考虑记录数进行优化)。具有相同emp_id 的记录将始终存储在存储桶中。同时,一个桶可能有许多emp_id 一起拥有更优化的数据块以供mapreduce 处理。 bucketing 特别有用,如果你想执行map-side 加入。

【讨论】:

【参考方案2】:

你的答案是正确的--

Hive 分区是提高大表查询性能的有效方法。分区允许您将数据存储在表位置下的单独子目录中。它极大地帮助了在分区键上查询的查询。

如果桶键和连接键是通用的,则桶可以提高连接性能。 Hive 中的分桶根据桶键上的哈希结果将数据分布在不同的桶中。如果进程发生在相同的键(列)上,它还可以减少连接过程中的 I/O 扫描。

【讨论】:

以上是关于在 Hive 中,分区快还是分桶快?的主要内容,如果未能解决你的问题,请参考以下文章

Hive 教程-分区表与分桶表

深入理解Hive分区与分桶

分区和分桶 Hive Table 有啥好处?

分区和分桶区别

hive扫描分区不超过400个

Hive的分区和分桶