是的我看见到处是阳光
小谈
分桶表之前一直在博客里面说,但是从来没有写过,此次写一下分桶表来加深一下印象,这篇博客写完之后会继续学习hive的相关知识,之前已经将数仓的基础写了。再往后就是项目实战了。
分桶表
分桶表的粒度比分区表的粒度还要更细。
不说那么多的概念,举一个例子,假如有一个表A,我们对A进行分桶,并且将user_id作为分桶字段,那么字段值会根据用户指定的值进行哈希,然后将哈希值相同的数据发到同一个桶里面,同一个user_id的数据会才能放在同一个桶里面。
虽然分桶表很容易理解,但是在操作的时候也会有一些小陷阱。
陷阱:
如果我们创建一个分桶表,然后将数据直接Load进去,按理来说,平常的表我们直接Load后就可以直接进行查询了,但是分桶表不行,分桶表Load数据后,进行SQL查询查找不到任何数据,虽然在hdfs中可以看到有相应的桶文件,但是没有数据。
亲身实践
首先看一下元数据
在下面的操作里面,我们会将左边的列作为分桶字段,并且分成四个桶。
之前说过,分桶的依据就是哈希值,分成四个桶。如何分呢?
1001 1001 % 4 1
1004 1004 % 4 0
1002 1002 % 4 2
1003 1003 % 4 3
以上面四个数字为例子,根据他们的余数作为哈希值进行分桶。刚好16个,四个桶,每个桶分四个。因为这个数据比较凑巧,刚好每个桶能分四个,如果数据乱一点,就不会是每个桶都是4个数据。
数据有了,我们现在创建分桶表。
将数据装载在分桶表里面
首先先说一下,我们分了四个桶,分了四个桶就会有四个reduce。正如上面那个图片所示,
number of reducers:4
数据装载完毕,我们查询一下数据
什么?!
输入 select * from stu_buck之后,结果为空。但是hdfs里面是有数据的,而且上面load数据的时候是成功的。查询为空,这个就是上面讲的陷阱。
改正
怎么改正呢?通过创建临时表,将数据装载在临时表里面然后通过临时表将数据插入在分桶表里面。
不多bb,直接看操作。
- 先清空之前创建的分桶表
因为之前我们用错误的方法将数据放在里面却无法查询,先将数据清空,清空的同时hdfs也会没有相关数据。
2.创建临时表
需要先开启分桶表的强行插入。
3.将临时表的数据插入在分桶表里面
4.查询数据
可以看到结果出来了,但是不同的是,这里的结果跟我们刚开始插入时候的数据顺序不一样,顺序变了。
左边的数据是最开始的时候的元数据,右边的数据就是分桶表的数据。
为什么查询后数据变了呢?
很简单,让我们先看一下hdfs上面的信息
000000_0 000001_0 000002_ 0 000003_0
上面的文件名字是按顺序的,就是所谓的桶表。
分桶1 分桶2 分桶3 分桶4
查询结果就是从 分桶1 分桶2 分桶3 分桶4里面进行查找。
第一个分桶里面的数据就是余数为0的数据。
1016 1012 1008 1004
这就是为什么输出出来的数据跟我们刚开始装载时候的顺序不一样。
总结:
分桶表和分区表都是很重要的,今天介绍的是分桶表。分区表在之前的博客已经介绍了。
下完这篇博客就要去做每日一题了。