Hive - 分桶和分区

Posted

技术标签:

【中文标题】Hive - 分桶和分区【英文标题】:Hive - Bucketing and Partitioning 【发布时间】:2015-12-04 20:00:01 【问题描述】:

我们应该根据什么来缩小是在 Hive 中的一组列上使用分区还是分桶?

假设我们有一个庞大的数据集,其中有两列最常被查询 - 所以我的明显选择可能是基于这两列进行分区,但如果这会导致大量的小在大量目录中创建文件,而不是根据这些列来分区数据是一个错误的决定,并且可能是分桶会是一个更好的选择。

我们能否定义一种方法来决定我们应该进行分桶还是分区?

【问题讨论】:

What is the difference between partitioning and bucketing a table in Hive ?的可能重复 【参考方案1】:

Bucketing 和 partitioning 不是独占的,你可以同时使用。

根据我相当长的 Hive 经验,我的简短回答是“您应该始终使用分区,有时您可能也想分桶”。

如果您有一张大表,分区有助于减少您查询的数据量。分区通常表示为 HDFS 上的目录。一个常见的用法是按年/月/日分区,因为大多数人按日期查询。 唯一的缺点是您不应该对具有大基数的列进行分区。 基数是大数据中的一个基本概念,它是一列可能具有的值的数量。例如,“US state”的基数较低(大约 50),而“ip_number”的基数很大(2^32 个可能的数字)。 如果在基数较高的字段上进行分区,hive 会在 HDFS 中创建非常多的目录,这是不好的(namenode 上的额外内存负载)。

分桶很有用,但在向表中插入数据时也必须遵守纪律。 Hive 不会检查您插入的数据是否按照应有的方式存储。 分桶表必须执行 CLUSTER BY,这可能会在您的处理中增加一个额外的步骤。 但是,如果您执行大量连接,如果 两个 表以相同的方式(在相同的字段和相同数量的存储桶上)存储,它们可以大大加快速度。此外,一旦确定了存储桶的数量,就无法轻易更改。

【讨论】:

【参考方案2】:

分区:

分区是根据某些条件分解/划分您的输入数据,例如:日期、国家/地区。

CREATE TABLE 日志(ts BIGINT,行 STRING) 分区(dt STRING,国家/地区字符串);

LOAD DATA LOCAL INPATH 'input/hive/partitions/file1' INTO TABLE 日志 PARTITION (dt='2012-01-01', country='GB');

加载数据后在仓库中创建的文件如下:

/user/hive/warehouse/logs/dt=2012-01-01/country=GB/file1/

/user/hive/warehouse/logs/dt=2012-01-01/country=GB/file2/

/user/hive/warehouse/logs/dt=2012-01-01/country=US/file3/

/user/hive/warehouse/logs/dt=2012-01-02/country=GB/file4/

/user/hive/warehouse/logs/dt=2012-01-02/country=US/file5/

/user/hive/warehouse/logs/dt=2012-01-02/country=US/file6

选择 ts、dt、行 来自日志 WHERE country='GB';

此查询将仅扫描 file1、file2 和 file4。

分桶:

分桶是根据其他一些条件进一步分解/划分您的输入数据。

我们可能希望将表(或分区)组织到存储桶中的原因有两个。

首先是启用更高效的查询。 Bucketing 在表上强加了额外的结构,Hive 在执行某些查询时可以利用这些结构。特别是,在相同列(包括连接列)上分桶的两个表的连接可以有效地实现为映射端连接。

对表进行分桶的第二个原因是为了提高采样效率。在处理大型数据集时,在开发或优化数据集的过程中尝试对一小部分数据集进行查询非常方便。

让我们看看如何告诉 Hive 一个表应该被分桶。我们使用 CLUSTERED BY 子句来指定要存储的列和存储桶的数量:

CREATE TABLE student (rollNo INT, name STRING) CLUSTERED BY (id) INTO 4 Bucket;

SELECT * FROM student TABLESAMPLE(BUCKET 1 OUT OF 4 ON rand());

【讨论】:

以上是关于Hive - 分桶和分区的主要内容,如果未能解决你的问题,请参考以下文章

深入理解Hive分区与分桶

Hive(大数据)- 分桶和索引之间的区别

分区和分桶区别

hive创建分区 9870查询不到

hive扫描分区不超过400个

hive的严格模式和分区