在 Hive 中,分区快还是分桶快?
Posted
技术标签:
【中文标题】在 Hive 中,分区快还是分桶快?【英文标题】:In hive ,is partitioning fast or bucketization fast? 【发布时间】:2018-03-09 18:39:04 【问题描述】:这是我面临的面试问题,如果我们在 HDFS 中有 1 TB 数据。 哪种类型的方法在 hive 中为我们提供了更快的性能,即 partitioning
或 bucketing
?
我根据我们选择partitioning
或bucketing
的数据告诉他们。但是面试官对我的回答并不满意。
什么应该是正确的答案(连同例子)?
【问题讨论】:
【参考方案1】:您的回答是正确的 - 这实际上取决于数据以及您想要对数据做什么。
Partitioning
用于以逻辑方式水平分布负载。它优化了性能,但有时它可能导致分区中的数量非常少。这会导致性能下降,因为 mapreduce
处理的文件比许多小文件大。
在这里,bucketing
可以提供帮助,因为bucketing
保证桶列的所有数据保持在一起。例如。如果我们对employee
表进行分桶并使用emp_id
作为分桶列,则该列的值将由用户定义的桶数进行散列(必须考虑记录数进行优化)。具有相同emp_id
的记录将始终存储在存储桶中。同时,一个桶可能有许多emp_id
一起拥有更优化的数据块以供mapreduce
处理。 bucketing
特别有用,如果你想执行map-side
加入。
【讨论】:
【参考方案2】:你的答案是正确的--
Hive 分区是提高大表查询性能的有效方法。分区允许您将数据存储在表位置下的单独子目录中。它极大地帮助了在分区键上查询的查询。
如果桶键和连接键是通用的,则桶可以提高连接性能。 Hive 中的分桶根据桶键上的哈希结果将数据分布在不同的桶中。如果进程发生在相同的键(列)上,它还可以减少连接过程中的 I/O 扫描。
【讨论】:
以上是关于在 Hive 中,分区快还是分桶快?的主要内容,如果未能解决你的问题,请参考以下文章