繁体   English   中英

如何在Hive 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根据上述属性进行一些分析。

在hive中,您将根据使用模式创建一个表,因此您应根据“分析查询”的外观选择对存储分区进行分区。

但是,以下几点是可取的

分区

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

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

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

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

如果您在Where condition提供city_category ,则它只能扫描一个文件夹,这有助于蜂巢查找特定记录。

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

假设您最终根据purchase_amount了分区,那么您将有很多文件夹。 NameNode必须维护每个文件夹和文件的位置,因此会给NameNode造成很大的负担,并明显降低查询的性能。

瓢泼大雨

  • 如果要连接的另一个表具有类似的存储桶,则可以帮助您加快连接查询的速度。
  • 但是,确保在存储分区中均匀分布数据是一个好主意。

无论执行什么存储,它都会在给定字段上应用哈希,并基于此将给定记录存储在存储中。

因此,假设您根据city_category进行存储分区并告诉创建50个存储分区。

CLUSTERED BY (city_category) INTO 50 BUCKETS

由于我们只有5个类别,因此其他45个存储桶将为空,这是您不想要的,因为这会降低查询的性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM