2014-11-03 47 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