Partition取值

在进行日志分析时,发现MapReduce和Hive计算出的数据结果存在差异。经过排查,问题根源在于Partition的处理不当。修正Partition的设置后,数据匹配成功。

   今天在做日志分析的时候遇到一个问题,数据总是对不上(一个是通过Mapreduce计算,另一个通过hive计算的),找了半天,发现时以下错误:

java.io.IOException: Illegal partition for com.sohu.tv.amstat.mr.AdvBookFlightSummary$CompositeKey@63d87b85 (-3)
	at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1073)
	at org.apache.hadoop.mapred.MapTask$NewOutputCollector.write(MapTask.java:691)
	at org.apache.hadoop.mapreduce.TaskInputOutputContext.write(TaskInputOutputContext.java:80)
	at com.sohu.tv.amstat.mr.AdvBookFlightSummary$AdMapper.map(AdvBookFlightSummary.java:265)
	at com.sohu.tv.amstat.mr.AdvBookFlightSummary$AdMapper.map(AdvBookFlightSummary.java:203)
	at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
	at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
	at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
	at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:396)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1083)

    可以看出,partitionor返回的值是-3,所以才会抛出这个异常,我看了下我的partionor代码:

public static class AdvBookFlightPartition extends Partitioner<CompositeKey, CompositeVal> {

        @Override
        public int getPartition(CompositeKey key, CompositeVal value, int nums) {
            return key.getRt().hashCode() % nums;
        }
    }
    hashCode方法会返回一个负值,所以取模后,partition的值是负数。

修正后即可:

public static class AdvBookFlightPartition extends Partitioner<CompositeKey, CompositeVal> {

        @Override
        public int getPartition(CompositeKey key, CompositeVal value, int nums) {
            return Math.abs(key.getRt().hashCode()) % nums;
        }
    }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值