同时对配置单元表进行分区和bucketing的好处到底是什么?我有一个表“订单”,其中包含100万条记录,但记录来自6个特定的城市。现在,如果我只根据城市来存储表订单,我会在我的warehouse dir(在hive中)中得到6个不同的文件夹,每个文件夹对应一个特定的城市和数据。
当我对表顺序进行分区和bucket时,仍然可以在配置单元下的warehouse dir中看到相同的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核,36gbram和8个集群上运行hadoop。
1条答案
按热度按时间qnakjoqk1#
分区和bucketing是在物理层拆分数据的两种不同类型。
如您所见,当您按列划分表时,将为列的每个值创建一个目录。因此,您通常希望对基数较低的列进行分区。您将看到的最常见的分区列之一是
date
.使用bucketing,列值被散列为固定数量的bucket。这也会在物理上分割数据。在您的情况下,如果您检查
city
目录,您将看到16个文件,每个bucket一个。bucketing通常用于高基数列。那么,分区和bucketing的优势是什么呢?由于数据在物理上是“分区的”,查询层可以应用两种类型的优化,称为分区修剪和桶修剪。这些优化将在
WHERE
子句可以允许优化器应用修剪策略。例如,在您的示例中,您有6个目录(城市)乘以16个文件(id bucket),因此表中总共有96个文件。如果您为包含where子句city = "city1"
,则只有16个文件将被扫描,因为分区修剪将启动。如果你用where子句id = 10101
,则只扫描6个文件,因为可以应用桶修剪。如果同时应用城市筛选器和id筛选器,则只需扫描1个文件。编辑:正如评论中指出的,bucket修剪只在tez引擎中实现。因此,虽然在理论上,桶可以修剪,优化还没有实现在Hive先生。