2014-11-03 70 views
0

我有如下形式的2个文件减去两个数字与Hadoop中相同的密钥

文件1

key1的值1

键2值2

...

文件2

KEY1 VALUE3

KEY2 VALUE4

...

我想以产生减少的形式

KEY1(值1-VALUE3)/ VALUE1

KEY2的输出( value2-value4)/ value2

我有地图编写密钥,值前面加了一个字符te灌装它 从文件1或文件2,但不知道未来该怎么写减少阶段

我的地图的方法是

public void map(LongWritable key,Text val,Context context) throws IOException,  InterruptedException 
    { 
     Text outputKey = new Text(); 
     Text outputValue = new Text(); 
     outputKey.set(key.toString()); 
     if ("A") 
     {    
      outputValue.set("A,"+val); 
     } 
     else 
     { 
      outputValue.set("B," + val); 
     } 
     context.write(outputKey, outputValue); 
    } 
} 

回答

1

它应该是足够简单,因为你已经标记了,虽然有点混乱开始。我假设发射值类似于A23(对于文件1)& B139(对于文件2)。代码段:

public void reduce(Text key, Iterable<Text> values, Context context) 
     throws IOException, InterruptedException { 

    int diff = 0; 
    int denominator = 1; 
    for (Text val : values) { 
     if (val.toString().startsWith("A")) { 
      denominator = Integer.parseInt(val.toString().substring(1)); 
      diff += denominator; 
     } else if (val.toString().startsWith("B")) { 
      diff -= Integer.parseInt(val.toString().substring(1)); 
     } else { 
      // This block shouldn't be reached unless malformed values are emitted 
      // Throw an exception or log it 
     } 
    } 
    diff /= denominator; 
    context.write(key, new IntWritable(diff)); 
} 

希望这会有所帮助。但我认为当key1key2相等时,您的方法将会严重失败。

UPDATE
map应该像下面的上述减速器的工作:

public void map(LongWritable key, Text val, Context context) 
      throws IOException, InterruptedException { 
     String fileName = ((FileSplit) context.getInputSplit()).getPath().getName(); 
     String[] keyVal = val.toString().split("\\s+"); 
     Text outputKey = new Text(keyVal[0]); 
     Text outputValue = new Text(); 
     outputKey.set(key.toString()); 
     if ("fileA".equals(fileName)) { 
      outputValue.set("A" + keyVal[1]); 
     } else { 
      outputValue.set("B" + keyVal[1]); 
     } 
     context.write(outputKey, outputValue); 
    } 
+0

谢谢。这是我第一次尝试,似乎不起作用。每次调用reduce时,值都是单个对象,而不是我期望的两个对象(每个文件中的一个用于同一个键)。我添加了我的地图方法,可能它是不正确的。案例key1 = key2在这个特定的例子中不会发生。 – user2175783 2014-11-04 01:35:02

+0

它甚至不会编译,标记在冥王星上;-)。我会更新问题本身,不想编辑答案。您稍后可能会将密钥类型更改为'InWritable',但请添加'keyVal'.length检查以消除AOBException。现在看看。 – blackSmith 2014-11-04 05:29:09

+0

他们拒绝了我对这个问题的编辑。所以我把它张贴在这里。我假定文件名是FileA和FileB。 – blackSmith 2014-11-04 10:03:52

0

我一直在使用NamedVector在这种情况下非常有用的发现。这提供了该值的标识,以便您可以根据“名称”对值执行必需的操作。

+0

谢谢我会看看NamedVector。 – user2175783 2014-11-04 01:34:36