本文共 638 字,大约阅读时间需要 2 分钟。
在前面,我们讲到了内部表和外部表,以及使用分区表对数据进行细分管理。其实对于每一个表或者分区,Hive还可以进行更为细颗粒的数据细分划分和管理,也就是桶(Bucket)。Hive也是针对某一列进行桶的组织,Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
把表(或者分区)组织成桶(Bucket)有两个理由:
(1)更高的查询效率:桶为表加上额外结构,链接相同列划分了桶的表,可以使用map-side join更加高效。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以
(2)更高的取样效率:没有分区的话需要扫描整个数据集
桶的概念就是MapReduce的分区的概念,两者完全相同。桶则是按照数据内容的某个值进行分桶,把一个大文件散列称为一个个小文件。物理上每个桶就是目录里的一个文件,一个作业产生的桶数量和reduce任务个数相同。
而分区表代表了数据的仓库,也就是文件夹目录。每个文件夹下面可以放不同的数据文件。通过文件夹可以查询里面存放的文件。但文件夹本身和数据的内容毫无关系。
这些小文件可以单独排序。如果另外一个表也按照同样的规则分成了一个个小文件。两个表join的时候,就不必要扫描整个表,只需要匹配相同分桶的数据即可。效率当然大大提升。
同样,对数据抽样的时候,也不需要扫描整个文件。只需要对每个分区按照相同规则抽取一部分数据即可。
转载地址:http://vsazi.baihongyu.com/