hive分桶和分区的联系和区别

众所周知:
Hive 数据表可以根据某些字段进行分区操作,细化数据管理,可以让部分查询更快。也可以进一步被分桶(Buckets),实际上就是MR编程中的 HashPartitioner。
——看起来二者似乎区别不大,但不管是论坛还是一些培训机构,都把二者分开来讲,但具体的区别有说的模棱两可,今天我就说一下我的理解:
——首先我要肯定分桶和分区都是为了细化文件,二细化文件的目的无非就是提高查询的速度,包括单表查询还是多表join查询,
——但二者的区别主要体现在,二者划分的文件数据不同,再让我们复习一点hdfs的知识了,因为hive对表数据的存储实际上就是在hdfs上文件存储,而不管是分区还是分桶,它们的数据都是作为表的子目录下的文件存储的。
——不管是分区还是分桶,都是DDL语句,也就是属于表结构的元数据信息,二者都保存在hive的metastore中维护,二者的地位是一样的,
——区别是分区只能按字段的value分区,而分桶则可以按照字段的value的HashPartitioner分区。分桶的好处在于不用讲一个表文件分化成过于细化的文件,众所周知,不管是hdfs存储文件还是mr处理数据,他们的优势都是针对于大批量的数据,而单个的小数据文件不但会浪费hdfs的存储空间,更会启动冗余的mapper进程,导致资源的浪费。
——重点来了,hive在查询一样表的时候,即使我们没有在sql语句上做任何标记,分桶、区的作用都能体现出来—查询速度有明显提高,那么里面发生了什么?实际上当sql查询表时会遍历hdfs上该表目录下的所有文件。
—— 上边我们所说的提高查询速度提高的是那部分数据呢?
1. 简化mr作业量。
2. 就是mr作业过程当中shuffer的
这二者是相辅相成的,并不能简单的区分开来,
通常来讲分区和分桶是有自己的单独的功能的,那也是根据上面所述,二者对数据的划分不同,我们人为划分的,下面举例说明。
——分区简化的本质是mr的作业量(当然相应的shuffer也就减少了),比如我们要查询某一字段的全部数据,可以直接根据分区的属性,只对表目录下响应的分区文件进行一个mr作业就OK了(因为有hive的内部抓取策略,有可能不进行reduce流程)。
——而分桶本质是减少shuffer花费的时间,(人为划分)

  1. 当我们对某一字段分区进行聚合操作,尤其是有group操作时,因为表文件已经被物理分桶为不同的文件,这样做的好处就是把被分桶的数据同一放到了一个或几个切片中,这样就在mapper端进行combine,然后就可以大大简化了从mapper端shuffer到reducer的数据了。

  2. 在进行多表join中,我们可以对id分桶,(而这时就不能对id分区了,原因还是避免过于细化文件),可以让相同分桶的数据进行字段join,只需要把该两个分桶shuffer到一个reducer中,同样减少了数据的shuffer。(你也可以是减少了mr处理的数据量,但如果不进行分桶,不只shuffer处理的数据增加,reducer的工作量也会大大增多)

  3. 另外分桶还有一个独特的作用就是取样,也就是下面这条sql:
    select id, name, age from bucketdemo tablesample(bucket 2 out of 4 on age);
    可以随机从不同的桶中抓取全部数据,也可以从一个桶中抓取部分数据。

https://blog.csdn.net/mrbcy/article/details/68490074

你可能感兴趣的:(hadoop--hive,hive分区和分桶的区别)