还是关于reduce迭代器

shangpiaoxue 发布于 2014/06/10 17:15
阅读 137
收藏 0

@xrzs 你好,想跟你请教个问题:

您之前说把迭代器中的内容加入到List中,我尝试了,但是还是有问题,希望得到你的帮助。如果方便的话,可否加您QQ呢?

假如reduce中迭代器中的内容是1,2,3 这三条,然后把这三条数据加入到List中,然后遍历List的时候发现显示的结果是3,3,3 ,而不是正确的1,2,3   ,我不知道是哪里出了问题。但是同样的代码放到纯java中却可以正常

代码如下:

  public static class Reduce extends Reducer<IntPair, Text, Text, Text>
    {
        public void reduce(IntPair key, Iterable<Text> values,Context context) throws IOException, InterruptedException
        { 
            Iterator<Text> it = values.iterator();
            List<Text> a= new ArrayList<Text>();
            while(it.hasNext()){
               a.add(it.next());
           }
           for(Text b:a){
               System.out.println(b);
           }

           context.write(new Text(), new Text());
        }
    }

加载中
0
大数据之路
大数据之路

估计你没看懂我上次给你的链接中的代码,你这份代码还是和你以前出的问题是一样的:List 中不能存 Text 类型,因为会遭遇对象重用的问题(具体请看上次我给你的链接中的分析)。

你的这份代码建议改成这样试试:

public static class Reduce extends Reducer<IntPair, Text, Text, Text>
    {
        public void reduce(IntPair key, Iterable<Text> values,Context context) throws IOException, InterruptedException
        {  
			// 这句代码纯属多余,values 已经是可迭代对象,直接 for 遍历即可。
            //Iterator<Text> it = values.iterator();
            //List<Text> a= new ArrayList<Text>();
			// 同上面,纯属多余,建议你看看、学习别人的代码,
			// 或者先从官方的 wordCount、helloWord 起步也行。
            // while(it.hasNext()){
               // a.add(it.next());
           // }
           //for(Text b:a){
               //System.out.println(b);
           //}
		   
		    // 直接这样存 String 类型的:
		   List<String> a= new ArrayList<String>();
		   for(Text val : values){
				a.add(val.toString)
		   }
		   for(String b:a){
				System.out.println(b);
		   }
			
           //context.write(new Text(), new Text());
        }
    }




返回顶部
顶部