繁体   English   中英

对Hive Table进行分区和存储的优势是什么?

[英]What is the advantage of partitioning and bucketing Hive Table?

同时对Hive表进行分区和存储的确切好处是什么? 我有一个表格“ Orders”,其中包含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个核心,具有8个集群的36 Gb RAM上运行Hadoop。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM