如何在hive表中选择分区和分区列?

问题描述 投票:0回答:1

以下模式的分区和分组的理想列是什么?是否有必要实施两者或一个是好的去?

user_id INTEGER UNSIGNED,
product_id VARCHAR(20),
gender ENUM('M','F') default NULL,
age VARCHAR(6),
occupation TINYINT UNSIGNED default NULL,
city_category ENUM('A','B','C','D','E') default NULL,
stay_in_current_city_years VARCHAR(6),
martial_status TINYINT UNSIGNED default 0,
product_category_1 TINYINT UNSIGNED default 0,
product_category_2 TINYINT  UNSIGNED default 0,
product_category_3 TINYINT UNSIGNED default 0,
purchase_amount INTEGER UNSIGNED default 0 

主要目标是使用Hive基于上述属性进行一些分析。

hadoop hive hiveql partitioning
1个回答
1
投票

在配置单元中,您可以根据使用模式创建表,因此您应该根据Analysis Queries的外观选择对存储分区进行分区。

但是,建议采用以下方法

分区

  • 分区可以帮助您使用谓词加速查询(即Where条件)。因此,在您的情况下,如果city_category是您将在大多数情况下使用的字段,那么您应该选择该字段进行分区。
  • 它可能会降低其他查询的性能。
  • 需要确保基数不是太高,否则,您的查询性能会降低。

要理解上述几点,您需要了解分区的工作原理。创建分区(或子分区)时,Hive会创建一个具有该名称的子文件夹,并将数据(文件)存储到这些文件夹中。

因此,如果您基于city_category进行分区,您的文件将如下所示。

/data/table_name/city_category=A
/data/table_name/city_category=B
...
/data/table_name/city_category=E

如果你在city_category中提供Where condition,这有助于hive找到特定的记录,因为它必须只扫描一个文件夹。

但是,如果您尝试查找基于user_idproduct_id的记录,则hive需要扫描所有文件夹。

让我们说如果你最终基于purchase_amount进行分区,那么你会有很多文件夹。 NameNode必须维护每个文件夹和文件的位置,因此它会在NameNode上产生大量负载,并显然会降低查询的性能。

瓢泼大雨

  • 如果您加入的另一个表具有相似的分组,它可以帮助您加快连接查询。
  • 但是,确保数据在分组中均匀分布是个好主意。

它的作用是什么,它在给定字段上应用散列并基于它在存储中存储给定记录。

所以,如果你基于city_category进行斗,并告诉创建50个桶。

CLUSTERED BY (city_category) INTO 50 BUCKETS

因为我们只有5个类别,其他45个桶都是空的,这是你不想要的,因为它会降低你的查询性能。

© www.soinside.com 2019 - 2024. All rights reserved.