自定义比较器报错

解决MapReduce程序在不同电脑上运行出现的排序错误,通过完善比较器逻辑修复Comparison method violates its general contract!异常。

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

发现一个特别奇葩的问题,在自己电脑上写的程序的使用MapReduce对数据进行清理,但是被同事拷贝了一份之后,在同事电脑上跑程序,就报错

使用的jdk版本是1.8的

java.lang.IllegalArgumentException: Comparison method violates its general contract!
    at java.util.TimSort.mergeHi(TimSort.java:899)
    at java.util.TimSort.mergeAt(TimSort.java:516)
    at java.util.TimSort.mergeForceCollapse(TimSort.java:457)
    at java.util.TimSort.sort(TimSort.java:254)
    at java.util.Arrays.sort(Arrays.java:1512)
    at java.util.ArrayList.sort(ArrayList.java:1454)
    at java.util.Collections.sort(Collections.java:175)
    at com.byhq.mapreduce.clikStream.pageViewReduce.reduce(pageViewReduce.java:42)
    at com.byhq.mapreduce.clikStream.pageViewReduce.reduce(pageViewReduce.java:16)
    at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:164)
    at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:610)
    at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:444)
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:449)

在网上查了很多帖子都是关于jdk版本的问题,然而使用其解决方式无济于事,自己查看错误的    at java.util.TimSort.mergeHi(TimSort.java:899)源码就会发现还是自己定义比较器的时候考虑不周到

原来的比较器定义比较条件的代码

  d1.getTime() >d2.getTime() ? 1 :-1

修改之后的比较器定义比较条件的代码

 d1.getTime()==d2.getTime() ? 0 :(d1.getTime() >d2.getTime() ? 1 :-1)

相比之下考虑的因素更加全面,问题解决,希望大家对大家有用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值