以下模式中用于分区和存储的理想列是什么?是必须同时实现还是两者兼而有之?
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对上述属性进行一些分析。
答案 0 :(得分:1)
在配置单元中,您将根据使用模式创建一个表,因此您应根据“分析查询”的外观选择对存储分区进行分区。
但是,以下几点是可取的
分区
city_category
是该字段,则将在大多数情况下使用where条件,则应选择该字段进行分区。 要了解以上几点,您需要了解分区的工作原理。当您创建分区(或子分区)时,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
,这将有助于蜂巢查找特定记录,因为它只需要扫描一个文件夹即可。
但是,如果您尝试基于user_id
或product_id
查找记录,则蜂巢需要扫描所有文件夹。
并且假设如果您最终基于purchase_amount
进行分区,那么您将拥有很多文件夹。 NameNode必须维护每个文件夹和文件的位置,因此会给NameNode造成很大的负担,并明显降低查询的性能。
装箱
执行存储操作的方式是,它在给定字段上应用哈希,并基于此功能将给定记录存储在存储区中。
因此,假设您是否基于city_category
进行存储分区并告诉创建50个存储分区。
CLUSTERED BY (city_category) INTO 50 BUCKETS
由于我们只有5个类别,因此其他45个存储桶将为空,这是您不想要的,因为这会降低查询的性能。