分区
分区表现为HDFS上表目录的子目录,数据按照分区存储在子目录中。如果查询的 where 字句的中包含分区条件,则直接从该分区去查找,而不是扫描整个表目录,合理的分区设计可以极大提高查询速度和性能。
在hive中创建表时使用partitioned by(partition_name string)定义分区
分桶
分桶是相对分区进行更细粒度的划分。按照某字段的hash值并对分桶个数取模。
例,按照name字段分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。在hive中创建表时使用clustered by(column_name) into N buckets定义分桶列及分桶个数N
两者区别
分区表 | 分桶表 | |
字段 | 表外字段(伪列),需要单独指定类型 | 表内字段,做hash算法后对分桶个数取模 |
表现形式 | 目录 | 文件 |
数量 | 可以不断增多 | 一旦确定数量不变 |
关键字 | partitioned by(partition_name string) | clustered by(column_name) into N buckets |
粒度 | 较粗 | 较细,可以对表进行先分区再分桶的划分策略 |
效率 | 避免全表扫描,根据分区列查询指定目录提高查询速度 | 分桶表数据进行抽样和JOIN时可以提高MR程序效率 |