如何在配置单元 Table 中选择用于分区和分桶的列?
How to choose columns for Partitioning and bucketing in hive Table?
以下模式的分区和分桶的理想列是什么?是否有必要同时实施,还是一个就可以实施?
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根据上述属性做一些分析。
在配置单元中,您根据使用模式创建了一个 table,因此您应该根据您的分析查询的外观来选择对分桶进行分区。
但是,以下内容是可取的
分区
- 分区可以帮助您加快使用谓词(即 Where 条件)的查询。因此,在您的情况下,如果
city_category
是您在 where 条件中大部分时间要使用的字段,您应该选择该字段进行分区。
- 它可能会降低其他查询的性能。
- 需要确保基数不要太高,否则查询性能会下降。
要理解以上几点,您需要了解分区的工作原理。当您创建一个分区(或子分区)时,Hive 会创建一个具有该名称的子文件夹并将数据(文件)存储到这些文件夹中。
因此,如果您根据 city_category
进行分区,您的文件将如下所示。
/data/table_name/city_category=A
/data/table_name/city_category=B
...
/data/table_name/city_category=E
如果您在 Where condition
中提供 city_category
,这有助于 hive 查找特定记录,因为它只需要扫描一个文件夹。
但是,如果您尝试根据 user_id
或 product_id
查找记录,则配置单元需要扫描所有文件夹。
假设您最终根据 purchase_amount
进行分区,那么您将拥有很多文件夹。 NameNode 必须维护每个文件夹和文件的位置,因此它会在您的 NameNode 上产生大量负载并明显降低查询性能。
分桶
- 如果您要加入的另一个 table 具有类似的分桶,它可以帮助您加快加入查询。
- 但是,确保数据在分桶中均匀分布是个好主意。
它是做什么的,它在给定的字段上应用散列,并基于它在存储中存储给定的记录。
所以假设您基于 city_category
存储桶并告诉您创建 50 个存储桶。
CLUSTERED BY (city_category) INTO 50 BUCKETS
因为我们只有 5 个类别,所以其他 45 个存储桶将是空的,这是您不想要的,因为它会降低查询的性能。
以下模式的分区和分桶的理想列是什么?是否有必要同时实施,还是一个就可以实施?
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根据上述属性做一些分析。
在配置单元中,您根据使用模式创建了一个 table,因此您应该根据您的分析查询的外观来选择对分桶进行分区。
但是,以下内容是可取的
分区
- 分区可以帮助您加快使用谓词(即 Where 条件)的查询。因此,在您的情况下,如果
city_category
是您在 where 条件中大部分时间要使用的字段,您应该选择该字段进行分区。 - 它可能会降低其他查询的性能。
- 需要确保基数不要太高,否则查询性能会下降。
要理解以上几点,您需要了解分区的工作原理。当您创建一个分区(或子分区)时,Hive 会创建一个具有该名称的子文件夹并将数据(文件)存储到这些文件夹中。
因此,如果您根据 city_category
进行分区,您的文件将如下所示。
/data/table_name/city_category=A
/data/table_name/city_category=B
...
/data/table_name/city_category=E
如果您在 Where condition
中提供 city_category
,这有助于 hive 查找特定记录,因为它只需要扫描一个文件夹。
但是,如果您尝试根据 user_id
或 product_id
查找记录,则配置单元需要扫描所有文件夹。
假设您最终根据 purchase_amount
进行分区,那么您将拥有很多文件夹。 NameNode 必须维护每个文件夹和文件的位置,因此它会在您的 NameNode 上产生大量负载并明显降低查询性能。
分桶
- 如果您要加入的另一个 table 具有类似的分桶,它可以帮助您加快加入查询。
- 但是,确保数据在分桶中均匀分布是个好主意。
它是做什么的,它在给定的字段上应用散列,并基于它在存储中存储给定的记录。
所以假设您基于 city_category
存储桶并告诉您创建 50 个存储桶。
CLUSTERED BY (city_category) INTO 50 BUCKETS
因为我们只有 5 个类别,所以其他 45 个存储桶将是空的,这是您不想要的,因为它会降低查询的性能。