可在减速机上循环两次

时间:2013-03-13 03:15:25

标签: java mapreduce

我正在实现两个相位矩阵乘法。下面的部分是第一阶段的减速机。键是左侧文件的行索引和右侧文件的列索引。 我希望输出计数与map和reducer相同。但它看起来像内循环增量与外循环相同的迭代器,因此减速器输出的数量等于键的数量。

代码:

@Override
        public void reduce(Text key, Iterable<Text> values, Context context)
        throws IOException, InterruptedException
        {
            for (Text outer : values) {
                String [] outerLine = outer.toString().split("\t");
                //int outerIndex = 0;
                //outerIndex = outerLine[0].equalsIgnoreCase(leftFilePattern) ? outerIndex : 1;
                if(outerLine[0].equalsIgnoreCase(rightFilePattern))
                    continue;
                double outerValue = Double.parseDouble(outerLine[2]);
                for (Text inner : values) {
                    String [] innerLine = inner.toString().split("\t");
                    if(innerLine[0].equalsIgnoreCase(leftFilePattern))
                        continue;
                    context.write(new Text(key.toString() + "-" + innerLine[1]), 
                                new DoubleWritable(outerValue * Double.parseDouble(innerLine[2])));
                }
            }

但是当我有简单的java应用程序时,如下所示:

List<Integer> l = Arrays.asList(10, 15);
        Iterable<Integer> it = l;
        for (Integer in : it) {
            for (Integer out : it) {
                System.out.println(in + " " + out);
            }
        }

此处输出的数量为4.如果内部循环与减速器的情况相同,则输出计数应为1,即(10 15)。

有人可以解释这种行为。

Vishal

1 个答案:

答案 0 :(得分:0)

实施Iterable可能会导致这种影响。

意图似乎是每个iterator()调用都应该返回自己的Iterator实例。 Iterable中的java.util类,包括List使用的私有Arrays.asList()类,都是这样做的。嵌套的foreach在同一个Iterable上需要这种行为,Iterable的陈述目的是预先支持。

我在Iterable API文档中找不到任何直接需要该行为的内容。

显然,如果两个iterator()调用使用相同的对象,则同一Iterable上的嵌套foreach语句将无法按照您描述的方式进行。

=============================================== ==========

如果发生了这种情况,我的最佳建议是首先将values复制每个文字参考文件复制到行为良好的List<Text>,例如ArrayList。您可以安全地对其元素执行嵌套循环。