2017-03-09 33 views
0

我在Eclypse中使用mapreduce時發生錯誤,我無法理解。在mapreduce地圖類中導入變量

映射一些功能我需要導入與我想用映射的新的已知特性(關鍵字)文件前。我首先將它導入覆蓋事件之後,但由於我有很多行,並且它爲每個映射導入它,所以計算時間很長。 我試圖導入我的類和@Override之間的變量只有一次導入,之後在類圖使用它,但我得到以下錯誤:

public static class Map extends Mapper<LongWritable, Text, Text, Text > { 

    HashSet<String> word = new HashSet<String>(); 
     BufferedReader BR = new BufferedReader(new FileReader(
       new File("/home/test"))); 
     String token; 
     while((token = BR.readLine()) != null){ 
      word.add(token); 
     } 

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

後,我得到「字符串標記;」錯誤:令牌 語法錯誤「;」,{此令牌

後預期「而」錯誤後:在令牌 語法錯誤,ConstructorHeaderName有望代替

後「公共無效」的錯誤: 這條線上的多個標記 - 標記「,」,;的語法錯誤預期 - 令牌上的語法錯誤「,」,;預計 - 令牌「(」語法錯誤;預計 - 覆蓋

所以我的問題是是否有可能導入,我想在地圖類,但@override前使用變量,我該怎麼辦?是什麼?


隨着第一個答案,我嘗試使用 「公共靜態......」

public static Set<String> newHashSet(String... strings) { 
     HashSet<String> words = new HashSet<String>(); 
     BufferedReader BR = new BufferedReader(new FileReader(
       new File("/home/test"))); 
     String token; 
     while((token = BR.readLine()) != null){ 
      words.add(mot); 
     } 
     return words; 
    } 

但我再次出現錯誤。

當我嘗試閱讀我的文件,我在這行 得到 多個標記 - 未處理的異常類型 FileNotFoundException異常 - 資源泄漏:「BR」是永遠不會關閉

,並在while循環 未處理的異常類型爲IOException

我只想導入我的文件並存儲數據以便稍後在我的mapreduce任務中使用它作爲條件。

+0

您可以發佈完整的代碼和完整的堆棧跟蹤? – LppEdd

+0

while循環不是構造函數或方法的一部分。這就是爲什麼你會得到這個錯誤。 – john16384

回答

0

您正在尋找兩件重要的事情來激發您的代碼。

  1. 地圖提供了setUp()Map()和Cleanup()功能。
  2. 該功能可用於讀取安裝程序中的某些外部文件,ETL Map()中的獨立行並清除Cleaup中的任何資源。
  3. 分佈式緩存是由MR farmework提供的服務。在驅動程序中,您分發了這些文件,並且這些文件在Map或Reduce工作的所有dataNode中都可用。

請通過下面的鏈接進行深入瞭解。

分佈式緩存,設置()地圖和清理()

  1. http://bytepadding.com/big-data/map-reduce/map-side-joins-in-map-reduce/
  2. http://bytepadding.com/map-reduce/