Apache Hive中的分区和分桶技术

在图书馆中,可能见过百科全书。这是一套书籍,可以提供几乎所有事物的信息。知道百科全书最好的地方是什么吗?没错,猜对了。这些词汇是按字母顺序排列的。例如,如果心中有一个词汇“金字塔”,可以直接去拿标题为“P”的书。不需要在其他书中搜索它。能想象如果书籍没有顺序地存放,搜索一本书的任务会有多困难吗?

在这里,按字母顺序存放词汇代表了索引,但使用不同的地点存放以相同字符开头的词汇被称为分桶。在Apache Hive中也有类似的存储技术,如分区和分桶,以便可以更快地获得搜索查询的结果。在本文中,将看到什么是分区和分桶,以及何时使用哪一个。

目录

  • 什么是分区?
  • 何时使用分区?
  • 什么是分桶?
  • 何时使用分桶?

什么是分区?

Apache Hive允许将表组织成多个分区,可以将相同类型的数据分组在一起。它用于水平分布负载。用一个例子来理解它:

假设需要在Hive中创建一个包含时尚电子商务公司产品详情的表。它有以下列:

CREATE TABLE products ( product_id string, brand string, size string, discount float, price float ) PARTITIONED BY (gender string, category string, color string);

现在,Hive将以如下目录结构存储数据:

/user/hive/warehouse/mytable/gender=male/category=shoes/color=black

分区数据给带来了性能优势,也帮助组织数据。现在,来看何时在Hive中使用分区。

何时使用分区?

当具有高搜索查询的列具有低基数时。例如,如果按国家名称创建分区,那么最多可以创建195个分区,这些目录数量是Hive可以管理的。另一方面,不要在具有非常高基数的列上创建分区。例如-产品ID、时间戳和价格,因为会创建数百万目录,这对Hive来说是不可能的。

当每个分区中的数据量不是很高时,它是有效的。例如,如果有航空公司数据,想计算一天内的总航班数。在这种情况下,结果将在分区“迪拜”上花费更多时间来计算,因为它拥有世界上最繁忙的机场之一,而像“阿尔巴尼亚”这样的国家将更快地返回结果。

什么是分桶?

在上面的例子中,知道不能在价格列上创建分区,因为它的数据类型是float,并且有无限多的唯一价格是可能的。Hive将不得不为每个唯一的价格生成一个单独的目录,这对Hive来说管理起来非常困难。相反,可以手动定义想要的桶的数量。

在分桶中,分区可以根据列的哈希函数被细分为桶。它为数据提供了额外的结构,可以用于更有效的查询。

CREATE TABLE products ( product_id string, brand string, size string, discount float, price float ) PARTITIONED BY (gender string, category string, color string) CLUSTERED BY (price) INTO 50 BUCKETS;

现在,无论价格列中有多少唯一值,都只会创建50个桶。例如,在第一个桶中,所有价格在[0-500]之间的产品将进入,而在下一个桶中,价格在[500-2000]之间的产品等等。

  • Apache Hive入门——所有大数据和数据工程专业人士必须了解的工具
  • Apache Hive中的表类型——快速概览
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485