首页 文章

分区和分区Hive Table有什么好处?

提问于
浏览
1

同时对Hive表进行分区和分区的好处是什么?我有一个表"Orders",其中包含1M条记录,但记录来自6个特定城市 . 现在,如果我只根据城市打开我的 table Orders ,我的仓库目录(在Hive中)有6个不同的文件夹,每个文件夹对应一个特定的城市和数据 .

当我分区然后将我的表 Orders 分区时,我仍然可以在hive下的仓库目录中看到相同的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核上运行Hadoop,36 Gb RAM和8集群 .

1 回答

  • 5

    分区和分段是在物理层分割数据的两种不同类型 .

    如您所见,当您按列对表进行分区时,将为该列的每个值创建一个目录 . 因此,你看到'll typically want to partition on a column that has low cardinality. One of the most common partition columns you'是 date .

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

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

    EDIT: 正如评论中所指出的,铲斗修剪仅在Tez引擎中实现 . 因此,虽然理论上可以修剪存储桶,但Hive MR中尚未实现优化 .

相关问题