今天在使用Hive的时候遇到了一个十分有这意思的问题,感觉有必要记录一下。
大体情况是这样的,我数据库表中有一个mytest的表,只有一个word的string类型字符串。表格很简单,如下:
里面的内容很简单,全部是字母:
使用hive首先分区,分成6个(我认为这里有六种不同的字母,所以分六个桶,分别存放),然后将结果输出到本地文件夹下。操作步骤为:
set mapred.reduce.tasks=6;
insert overwrite local directory '/home/hadoop/out' select * from mytest distrubute by word sort by word;
我们查看文件夹下:
有六个文件,与我们预期的一样。按我想每个文件里存放同一种字母:
傻眼了,不对呀,怎么有些搞到一起去了。经过本王的检查发现,原来distribute的原理搞错了。那是怎么搞得呢,如果说hive的分桶原理与mapreduce的原理相同的话,那么我们可不可以把此过程看作是maptask的分区功能呢,那么他就会对reduce的个数进行模除。想到这里,相比大家都明白了,我再付一张图:
这下懂了,原来放一起的字母的hash码对6的模除相同,所以放在了一起,原来distribute的分区是根据分区字段与reduce的个数进行模除分区的,并不是像group by这种根据字段是否相同分区,涨知识了。