室友不会Hive中的分桶表,我给室友讲

是的我看见到处是阳光

小谈

        分桶表之前一直在博客里面说,但是从来没有写过,此次写一下分桶表来加深一下印象,这篇博客写完之后会继续学习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,直接看操作。

  1. 先清空之前创建的分桶表

        因为之前我们用错误的方法将数据放在里面却无法查询,先将数据清空,清空的同时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

        这就是为什么输出出来的数据跟我们刚开始装载时候的顺序不一样。

总结:

        分桶表和分区表都是很重要的,今天介绍的是分桶表。分区表在之前的博客已经介绍了。

        下完这篇博客就要去做每日一题了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值