以下模式的分区和分组的理想列是什么?是否有必要实施两者或一个是好的去?
user_id INTEGER UNSIGNED,product_id VARCHAR(20),性别 …
在配置单元中,您可以根据使用模式创建表,因此您应该根据Analysis Queries的外观选择对存储分区进行分区。
但是,建议采用以下方法
的 分区 强>
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 因为它必须只扫描一个文件夹。
Where condition
但是,如果您尝试查找基于的记录 user_id 要么 product_id 然后蜂巢需要扫描所有文件夹。
user_id
product_id
如果你最终基于分区,那么就说吧 purchase_amount ,那么你会有很多文件夹。 NameNode必须维护每个文件夹和文件的位置,因此它会在NameNode上产生大量负载,并显然会降低查询的性能。
purchase_amount
的 瓢泼大雨 强>
它的作用是什么,它在给定字段上应用散列并基于它在存储中存储给定记录。
所以,如果你基于的话,那么就说吧 city_category 并告诉创建50个桶。
CLUSTERED BY (city_category) INTO 50 BUCKETS
因为我们只有5个类别,其他45个桶都是空的,这是你不想要的,因为它会降低你的查询性能。