什么是分区分桶?
分区和分桶面试过程中会经常考察,需要重点掌握。
分区
什么是分区
将整个表的数据在存储时,按照 “分区键的列值” 划分成多个子目录来存储。区从形式上可以理解为文件夹。
注意:子目录名称就是分区名(分区键的列值)。
为什么要分区
随着系统运行时间的增加,表的数据量会越来越大,而 Hive 查询数据的数据的时候通常使用的是“全表扫描”,这样将会导致查询效率大大的降低。
Hive 引进的分区技术,能避免 Hive 全表扫描,提升查询效率。
比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。那其实这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找。
创建分区表
创建分区表的时候,要通过关键字 partitioned by (name string)
声明该表是分区表,并且是按照字段 name 进行分区,name 值一致的所有记录存放在一个分区中,分区属性 name 的类型是 string 类型。当然,可以依据多个列进行分区,即对某个分区的数据按照某些列继续分区。
分桶
什么是分桶
分桶是相对分区进行更细粒度的划分。桶是通过对指定列进行哈希计算来实现的,通过哈希值将一个列名下的数据切分为一组桶,并使每个桶对应于该列名下的一个存储文件。
注意:在 hdfs 目录上,桶是以文件的形式存在的,而不是像分区那样以文件夹的形式存在。
为什么要分桶
在分区数量过于庞大以至于可能导致文件系统崩溃时,我们就需要使用分桶来解决问题了。
分区中的数据可以被进一步拆分成桶,不同于分区对列直接进行拆分,桶往往使用列的哈希值对数据打散,并分发到各个不同的桶中从而完成数据的分桶过程。
创建分桶
与分区不同的是,分区依据的不是真实数据表文件中的列,而是我们指定的伪列,但是分桶是依据数据表中真实的列而不是伪列。所以在指定分区依据的列的时候要指定列的类型,因为在数据表文件中不存在这个列,相当于新建一个列。而分桶依据的是表中已经存在的列,这个列的数据类型显然是已知的,所以不需要指定列的类型。