gpt4 book ai didi

hadoop - 对 Hive Table 进行分区和分桶有什么好处?

转载 作者:可可西里 更新时间:2023-11-01 14:43:36 25 4
gpt4 key购买 nike

同时对 Hive 表进行分区和分桶究竟有什么好处?我有一张“订单”表,其中包含 100 万条记录,但是这些记录来自 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 内存和 8 个集群上运行 Hadoop。

最佳答案

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

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

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

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

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

关于hadoop - 对 Hive Table 进行分区和分桶有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44101590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com