分享

一个mapreduce,非常诡异的问题,急求为什么?

狒狒 发表于 2015-3-21 12:33:45 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 6 12667
      
  1. @Override
  2.         protected void reduce(Text key, Iterable<RecordBean> values,Context context)
  3.                 throws IOException, InterruptedException {
  4.             RecordBean[]  beans = new RecordBean[2];
  5.             Iterator<RecordBean> iter = values.iterator();
  6.             int i  = 0;
  7.             while(iter.hasNext()){
  8.                 beans[i] = iter.next();
  9.                 mos.write("info", beans[i].getKeyString(),beans[i].getCompString() + "-" +beans[i]);
  10.                 //这里输出,很明显其中日期是不一样的
  11.                 //13755556666    changchun20140202haha24-13755556666|changchun|20140202|haha|24
  12.                 //13755556666    changchun20140101haha24-13755556666|changchun|20140101|haha|24
  13.                 i = i+1;
  14.             }
  15.             if(beans.length == 2 && beans[0].equals(beans[1])){
  16.                 mos.write("same",beans[0].getKeyString(),beans[0]);
  17.                 mos.write("same",beans[1].getKeyString(),beans[1]);
  18.                 //但在这里有一样了,这是为什么?
  19.                 //13755556666    13755556666|changchun|20140101|haha|24
  20.                 //13755556666    13755556666|changchun|20140101|haha|24
  21.             }else{
  22.                 mos.write("unsame", beans[0].getKeyString(),beans[0]);
  23.             }        
  24.         }
复制代码



需求是这样的,每个redude会输入1-2条记录,
如果2条记录相等,输入到一个same文件里面。
如果不相等,输入到一个unsame文件里面。

但是很诡异的问题出现了,在iter给RecordBean赋值的时候,两条记录是不一样的。
但在下面做判断输出的时候,输出的记录是一样的?
why?搞不明白了?多谢各位大神,给研究啊研究啊!

已有(6)人评论

跳转到指定楼层
jixianqiuxue 发表于 2015-3-21 12:48:40
本帖最后由 jixianqiuxue 于 2015-3-21 12:59 编辑


改成这样:看看效果

  1. if(beans.length == 2 && beans[0]!=beans[1]){
  2. mos.write("unsame",beans[0].getKeyString(),beans[0]);
  3. mos.write("unsame",beans[1].getKeyString(),beans[1]);
  4. }else{
  5. mos.write("same", beans[0].getKeyString(),beans[0]);
  6. }
复制代码



回复

使用道具 举报

狒狒 发表于 2015-3-21 12:58:22
jixianqiuxue 发表于 2015-3-21 12:48
改成这样:看看效果

问题仍然存在,晕了!
回复

使用道具 举报

jixianqiuxue 发表于 2015-3-21 12:59:40
狒狒 发表于 2015-3-21 12:58
问题仍然存在,晕了!

截图出来,这样应该没有问题了
回复

使用道具 举报

狒狒 发表于 2015-3-21 13:07:19
jixianqiuxue 发表于 2015-3-21 12:59
截图出来,这样应该没有问题了

大神,你好。我真的没有必要骗你,按你说的改完之后,输出是一样的!
我想问问你的判断是什么?
==  是判断内存的手地址
equals 是判断内容,我自己重写的!
但是这2中判断,尽然结果都是一样的,神奇!

附上我的equals方法
  1. @Override
  2.         public boolean equals(Object obj) {
  3.                 if (this == obj)
  4.                         return true;
  5.                 if (obj == null)
  6.                         return false;
  7.                 if (getClass() != obj.getClass())
  8.                         return false;
  9.                 RecordBean other = (RecordBean) obj;
  10.                 if (compString == null) {
  11.                         if (other.compString != null)
  12.                                 return false;
  13.                 } else if (!compString.equals(other.compString))
  14.                         return false;
  15.                 if (keyString == null) {
  16.                         if (other.keyString != null)
  17.                                 return false;
  18.                 } else if (!keyString.equals(other.keyString))
  19.                         return false;
  20.                 return true;
  21.         }
复制代码





回复

使用道具 举报

狒狒 发表于 2015-3-21 14:29:35
搞定了,这个问题,一会会把问题原因,写出来!
回复

使用道具 举报

狒狒 发表于 2015-3-21 15:10:20
仔细研究了一下代码

简单的说下问题原因
发现问题的原因处在beans[i] = iter.next();
这一句上!
iter.next();相当于c里面的指针,执行一个内存地址,
第一次把beans[0] = next()地址;
第二次把beans[1] = next()地址;

所以beans[0] = beans[1] = next()
所以后面的输出是一样的!
处理办法
通过new 新的数组对象。而不是直接使用 next()指向的对象
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条