面向初学者的数据工程– Apache Hive中的分区与存储分区

什么是分区?

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

假设我们必须在配置单元中创建一个表,其中包含时尚电子商务公司的产品详细信息。它包含以下列:

数据

现在,大多数客户使用的第一个过滤器是“性别”,然后他们选择了“衬衫”,其尺寸和颜色等类别。让我们看看如何为该示例创建分区。

创建表产品(product_id字符串,

品牌字串,

大小字符串,

折扣浮动

价格浮动

分区依据(性别字符串,

类别字符串,

颜色字符串);

现在,配置单元会将数据存储在目录结构中,如下所示:

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

分区

对数据进行分区不仅可以为我们带来性能上的好处,还可以帮助我们组织数据。现在,让我们看看何时在配置单元中使用分区。

何时使用分区?

搜索查询量高的列具有低基数时。例如,如果您使用国家/地区名称创建分区,那么最多将创建195个分区,并且这些目录可以由配置单元管理。

另一方面,请勿在基数很高的列上创建分区。例如,产品ID,时间戳和价格,因为它们会创建数百万个目录,这对于蜂巢来说是无法管理的。

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

什么是存储桶?

在上面的示例中,我们知道我们无法在列价格上创建分区,因为其数据类型为float,并且有无限数量的唯一价格是可能的。

蜂巢将必须为每个唯一价格生成一个单独的目录,并且蜂巢将很难管理这些目录。取而代之的是,我们可以手动定义此类列所需的存储桶数。

铲斗

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

创建表产品(product_id字符串,

品牌字串,

大小字符串,

折扣浮动

价格浮动

分区依据(性别字符串,

类别字符串,

颜色字符串)

(价格)集中到50个桶中;

现在,无论价格列中有多少个唯一值,都只会创建50个存储桶。例如,在第一个存储桶中,价格为[0 – 500]的所有产品都将消失,在下一个存储桶中,价格为[500 – 200]的产品将以此类推。

什么时候使用存储桶?

我们不能在基数很高的列上进行分区。过多的分区将导致多个Hadoop文件,这将增加同一节点上的负载,因为该节点必须承载每个分区的元数据。

如果查询中涉及某些地图侧联接,则存储表是一个不错的选择。映射侧连接是一个过程,其中两个表仅使用映射功能进行联接,而没有任何简化的功能。我建议您仔细阅读本文,以进一步了解地图侧连接:Hive中的地图侧连接

题库