【问题标题】: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。

【问题讨论】:

    标签: hadoop hive hiveql


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 2019-11-29
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多