Hive distribute 问题

在使用Hive处理数据时,遇到一个关于distribute by的问题。试图将表mytest按word字段分成6个桶,但发现结果并非预期,部分字母混合在了一起。通过分析发现,distribute by是根据字段值的hash码对reduce任务数量取模进行分区,而非像group by那样基于字段值的相等性。这一过程类似于MapReduce的分区功能,增长了对Hive分区原理的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在使用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这种根据字段是否相同分区,涨知识了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值