分区是将表的数据在物理上分成不同的文件夹,以便于在查询时可以精准指定所要读取的分区目录,从来降低读取的数据量
分桶是将表数据按指定列的hash散列后分在了不同的文件中,将来查询时,hive可以根据分桶结构,快速定位到一行数据所在的分桶文件,从来提高读取效率
分区表:原来的一个大表存储的时候分成不同的数据目录进行存储。如果说是单分区表,那么在表的目录下就只有一级子目录,如果说是多分区表,那么在表的目录下有多少分区就有多少级子目录。不管是单分区表,还是多分区表,在表的目录下,和非最终分区目录下是不能直接存储数据文件的
分桶表:原理和hashpartitioner一样,将hive中的一张表的数据进行归纳分类的时候,归纳分类规则就是 hashpartitioner。(需要指定分桶字段,指定分成多少桶)分区表和分桶的区别除了存储的格式不同外,最主要的是作用:
分区表:细化数据管理,缩小 mapreduce程序 需要扫描的数据量。
分桶表:提高join查询的效率,在一份数据会被经常用来做连接查询的时候建立分桶,分桶字段就是连接字段;提高采样的效率。
有了分区为什么还要分桶?
(1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive在处理有些查询时能利用这个结构。
(2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
分桶是相对分区进行更细粒度的划分。分桶将表或者分区的某列值进行hash值进行区分,如要按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。
与分区不同的是,分区依据的不是真实数据表文件中的列,而是我们指定的伪列,但是分桶是依据数据表中真实的列而不是伪列。
Hive如何实现分区?
建表:create table tablename(col1 string) partitioned by(col2 string);
添加分区:alter table tablename add partition(col2=’202101’);
删除分区:alter table tablename drop partition(col2=’202101’);
与分区有关的有两种类型的分区:静态和动态。在静态分区中,您将在加载数据时(显式)指定分区列。
而在动态分区中,您将数据推送到 Hive,然后 Hive 决定哪个值应进入哪个分区。
要启用动态分区,请设置下面的属性:hive.exec.dynamic.parition.mode=nonstrict;
insert overwrite table emp_details_partitioned partition(location)
select * from emp_details;