2013-09-28 42 views
2

我正在使用0減少方法來解決我的問題。我希望從一個文件中預處理數據,然後將其作爲另一個文件寫出,但沒有新行和製表符分隔符?我如何輸出已經處理過我的數據的地圖作業,使用相同的文件格式減去預處理。 也就是說,我有這樣的事情:MapReduce:如何輸出不帶換行符的鍵/值對?

預處理:

<TITLE> Herp derp </Title> I am a major general 

後期處理:

Herp 
Derp 
I 
am 
a 
major 
general 

我希望它做的是這樣的:

Herp Derp I am a major general 

我相信問題出在這行代碼上:

job.setOutputFormatClass(TextOutputFormat.class); 

然而,當我試過了,很天真地做一些事情,如:

job.setOutputFormatClass(null); 

這顯然是行不通的。是否有格式類提供,我可以用它來做到這一點?如果沒有,我怎麼能寫我自己的課程,只是想輸出所有內容?我是新來的hadoop和地圖減少。

我已經在下面包含了我的地圖功能。我不想使用reduce,因爲它會在地圖和縮減器之間進行排序。

 public void map(LongWritable key, Text value, Context context) 
       throws IOException, InterruptedException { 

      String line = value.toString(); 
      StringTokenizer tokenizer = new StringTokenizer(line); 


      while (tokenizer.hasMoreTokens()) { 

       word.set(tokenizer.nextToken()); 

       //Did preprocessing here, irrelevant to my problem 

       context.write(word, null); 
      } 
     } 

此外,我也google了這一點,並閱讀apache hadoop api,看看我是否能夠回答一個答案。

回答

1

在您的映射類,而不是解析您的線路爲單個單詞,寫出來,嘗試發送整條生產線的

context.write(word, null); 

這樣,它是保持你最初合作的整個字符串,而不是一塊一塊地發送出去。

因此,爲預處理工作分開您的字符串,然後在您使用context.write命令發送出來時將其放回到一起。

+0

這工作。我將每個單詞輸出爲一個鍵/值對。但是這個文件中的每個「文檔」都是一行。所以一旦我這樣做了,一切都清理了。謝謝。 – GeekyOmega

+0

@GeekyOmega:你想要根據輸入排序輸出嗎? –

0

如果您的映射程序正在從單個輸入行編寫包含單個標記的多條記錄,那麼您絕對需要一個reducer將這些標記重新組合爲一條輸出行。沒有減速器就無法做到這一點。

+0

我的情況非常狹窄。我的映射器不寫多個記錄。相反,它是採取一個原始文件,並處理它,並返回值預處理像我想要的,但現在在每一個單獨的行。 – GeekyOmega

+0

每次調用映射器的次數是多少次都調用context.write()。聽起來不止一個。如果你想從這些多次寫入的單行輸出,那麼你需要一個reducer。 –

+0

我將編輯我的代碼以顯示我的地圖功能。但我可以對減速機說不。我會銷燬我的文件格式。把它當作解析一本書,一首歌,或者其他東西。如果我使用reducer,這將得到排序並破壞我解析它的任何價值。我基本上使用Mapreduce解析出一些XML標籤的東西。我也做了一些詞幹和停用詞。但是,我想保持獨立。 – GeekyOmega

相關問題