两种用于优化查询性能的数据组织策略,数仓设计的关键概念,可提升Hive在读取大量数据时的性能。
根据表的某列的值来组织数据。每个分区对应一个特定值,并映射到HDFS的不同目录。
常用于经常查询的列,如日期、区域等。这样可以在查询时仅扫描相关的分区,而不是整个数据集,从而减少查询所需要处理的数据量,提高查询效率。
物理上将数据按照指定的列(分区键)值分散存放于不同的目录中,每个分区都作为表的一个子目录。
CREATE TABLE orders (
order_id INT,
order_date DATE,
order_customer INT,
order_total FLOAT
)
PARTITIONED BY (country STRING);
基于country
列创建分区将使得每个国家的订单数据存储在不同的目录中。
使用哈希函数将数据行分配到固定数量的存储桶(即文件)中。这在表内部进一步组织数据。
CREATE TABLE user_activities (
user_id INT,
activity_date DATE,
page_views INT
)
CLUSTERED BY (user_id) INTO 256 BUCKETS;
user_id
是用于分桶的列,数据会根据用户ID的哈希值分配到256个存储桶中。
使用分区时要注意避免过多分区会导致元数据膨胀,合理选择分区键,确保分布均匀;而分桶则通常针对具有高度重复值的列。两者结合使用时,可以进一步优化表的读写性能和查询效率。
参考: