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

Posted

技术标签:

【中文标题】分区和分桶 Hive Table 有啥好处?【英文标题】:What is the advantage of partitioning and bucketing Hive Table?分区和分桶 Hive Table 有什么好处? 【发布时间】:2017-10-21 10:41:57 【问题描述】:

同时对 Hive 表进行分区和分桶有什么好处? 我有一个“订单”表,其中包含 1M 条记录,但这些记录来自 6 个特定城市。 现在,如果我只根据城市存储我的表 Orders,我会在仓库目录(在 Hive 中)中获得 6 个不同的文件夹,每个文件夹对应于一个特定的城市及其数据。

当我分区然后存储我的表 Orders 时,我仍然可以在配置单元下的仓库目录中看到相同的 6 个文件夹。我尝试使用 16 个存储桶,但数据文件夹仍然按城市划分。 下面是代码:

      create table Orders ( id int, name string, address string)
      partitioned by (city string)
      clustered by (id) into 16 buckets
      row format delimited fields terminated by ','
      stored as TEXTFILE

有人可以概述一下为什么 Hive 会这样。 此外,我还运行了一些性能指标,例如计数和分组。我没有发现分区分区表与仅分区表或仅分区表相比有任何显着改进。

谢谢。

我在 12 核、36 Gb RAM 和 8 个集群上运行 Hadoop。

【问题讨论】:

【参考方案1】:

分区和分桶是在物理层拆分数据的两种不同类型。

如您所见,当您按列对表进行分区时,将为该列的每个值创建一个目录。因此,您通常希望在基数较低的列上进行分区。您将看到的最常见的分区列之一是 date

通过分桶,列值被散列到固定数量的桶中。这也会在物理上拆分您的数据。在您的情况下,如果您检查 city 目录中的文件,您将看到 16 个文件,每个存储桶 1 个。分桶通常用于高基数列。

那么,分区和分桶的优势是什么?由于数据在物理上是“分区的”,因此查询层可以应用两种类型的优化,称为分区修剪和存储桶修剪。这些优化将在应用 WHERE 子句时启动,该子句可以允许优化器应用修剪策略。例如,在您的情况下,您有 6 个目录(城市)乘以 16 个文件(id 存储桶),因此您的表中总共有 96 个文件。如果为city = "city1" 包含 where 子句,则将只扫描 16 个文件,因为分区修剪将启动。如果您为 id = 10101 使用 where 子句,则将仅扫描 6 个文件,因为可以应用存储桶修剪。如果同时应用城市过滤器和 id 过滤器,则只需扫描 1 个文件。

编辑: 正如 cmets 中所指出的,桶剪枝仅在 Tez 引擎中实现。因此,虽然理论上可以修剪存储桶,但 Hive MR 中尚未实现优化。

【讨论】:

适用于分区,适用于分桶,但是理论与实践之间存在差距***.com/questions/43608422/…。分桶的优势目前在 SAMPLE / JOIN / GROUP BY 操作中。 @DuduMarkovitz 不再...桶修剪已在 Hive 2.0 中实现 issues.apache.org/jira/browse/HIVE-11525 这张票似乎只与 tez 相关 @DuduMarkovitz 好点...更新了答案以包含该评论。

以上是关于分区和分桶 Hive Table 有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章

Hive里的分区和分桶再谈

入门大数据---Hive分区表和分桶表

Hive:第 7 章 分区表和分桶表

Hive的分区和分桶

hive的分区和分桶

分区和分桶区别