Hive 分区和分桶的原理:
1、分区:分区是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。那其实这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找,避免全表扫描,可以提高查询效率。
注意:分区只是添加了一个伪列,这个伪劣使我们人为规定的,只在查询的时候显示,实际在表中并不存在这个列。
分区的目的就是提高查询效率,查询分区数据的方式就是指定分区名,指定分区名之后就不再全表扫描,直接从指定分区中查询,从hdfs的角度看就是从相应的文件系统中去查找特定的数据
hive分区表建立方式:
create table test1 (
id int comment ‘工号’,
name string comment ‘名字’
)
comment ‘工号表’
partitioned by (ddate string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’ ;
2、分桶:分桶是相对分区进行更细粒度的划分。分桶将整个数据内容按照某列属性值的hash值进行区分,如要按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。
注意:分桶的列是表中已存在的列,而不是伪列。分桶的信息在hdfs上看不到相关的文件,但是可以查询到分桶中的数据,说明确实分桶了。
hive分桶表的建立方式:
create table test1 (
id int comment ‘工号’,
name string comment ‘名字’
)
comment ‘工号表测试分桶’
clustered by(id) into 4 buckets
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’ ;
3、分区和分桶的区别:
(1)分区是指定伪列进行分区,分桶是表格中真实存在的列。
(2)分区信息在hdfs上显示的是分区文件夹,而分桶在hdfs上看不到,但是查询分桶数据们可以查询到。
(3)分桶是数据的更精细的划分。
4、分桶的使用场景:
(1)当使用分区进行数据划分的时候,出现有些分区数据过多,而有些分区数据过少的时候,这时候可以采用分桶,对数据进行划分。
(2)提升Join查询的效率,若两个表都在连接的字段上进行了分桶,那么在join的时候可以使用 Map 端连接 (Map-side join)高效的实现。比如Join 操作。对于Join 操作两个表有一个相同的列,如果对这两个表都进行了分桶操作。那么将保存相同列值的桶进行Join 操作就可以,可以大大减少Join 数据量。
(3)方便抽样:使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。