我了解Hive表中分区和桶的概念。但是我想知道的是,“什么时候我们需要使用分区,什么时候我们需要使用桶?”有哪些理想的场景适合使用分区和桶?
使用分区和分桶的主要原因。
对表数据进行分区是为了水平分布负载。
例如:如果我们有一个名为“Parts”的非常大的表,并且经常运行“where”查询,限制结果为特定零件类型。
为了更快地响应查询,可以按(PART_TYPE STRING)对表进行分区。一旦对表进行了分区,它会改变Hive结构化数据存储的方式,Hive现在将创建反映分区结构的子目录,如下所示:
.../Parts/PART_TYPE = Engine-Part
.../Parts/Part_Type = Brakes
现在,如果您在“零件”表中运行带有WHERE PART_TYPE = 'Engine-Part'的查询,它只会扫描一个目录PART_TYPE =' Engine-Part' 的内容。
分区功能在Hive中非常有用。但同时,它可能需要很长时间来执行其他查询。
另一个缺点是,如果我们创建太多分区,就会创建大量的Hadoop文件和目录,这些文件和目录是不必要的,并且会成为NameNode的负担,因为NameNode必须将文件系统的所有元数据文件保存在内存中。
桶分配是另一种技术,可用于进一步将数据划分为更易管理的形式。
例如:假设“part_sale”表具有“sale_date”的顶级分区,并且进一步分区为“part_type”作为第二级分区。
这将导致太多的小分区。
.../part_sale/sale-date = 2017-04-18/part_type = engine_part1
.../part_sale/sale-date = 2017-04-18/part_type = engine_part2
.../part_sale/sale-date = 2017-04-18/part_type = engine_part3
.../part_sale/sale-date = 2017-04-18/part_type = engine_part4
PARTITIONING
会在列中有少量唯一值且您想要使用所需的 WHERE 子句进行加载时使用。
BUCKETING
将用于 WHERE 子句中存在多个唯一值的情况。