2016-03-08 68 views
0

我寫了一個映射工作,這佔用了一堆鳴叫和關鍵字的列表,併發出關鍵字如何在運行時更改map-reduce作業的作業參數?

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

    JSONObject tweetObject = null; 

    ArrayList<String> keywords = this.getKeyWords(); 

    try { 
     tweetObject = (JSONObject) parser.parse(value.toString()); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    if (tweetObject != null) { 
     String tweetText = (String) tweetObject.get("text"); 

     StringTokenizer st = new StringTokenizer(tweetText); 

     ArrayList<String> tokens = new ArrayList<String>(); 

     while (st.hasMoreTokens()) { 
      tokens.add(st.nextToken()); 
     } 

     for (String keyword : keywords) { 

      for (String token : tokens) { 
       token = token.toLowerCase(); 
       if (token.equals(keyword) || token.contains(keyword)) { 
        output.write(new Text(keyword), one); 
        break; 
       } 
      } 
     } 

    } 
    output.write(new Text("count"), one); 

} 

ArrayList<String> getKeyWords() { 

    ArrayList<String> keywords = new ArrayList<String>(); 

    keywords.add("vodka"); 
    keywords.add("tequila"); 
    keywords.add("mojito"); 
    keywords.add("margarita"); 

    return keywords; 

} 

現在我的關鍵字列表是靜態的/在地圖,減少罐子硬編碼的鳴叫計數文件,我該如何使這種動態?即我希望能夠在運行時更改關鍵字?

這樣做的最好方法是什麼?

回答

0

從我頭上的多種方式:查詢web服務,讀取文件。

在任何情況下,您可能不希望爲您映射的每條記錄執行此操作。使用緩存層(例如Guava)緩存外部數據源並使其無效(例如,通過時間或修改)是相當常見的。

+0

閱讀文件的方式如何?地圖作業將在各種服務器上運行,對於不同的服務器,路徑可能會有所不同。 – Dude

+0

@Dude你有HDFS在你的處置,爲什麼從本地磁盤讀取? –

+0

但是,如果我把關鍵字文件放在hdfs中,它會被分割到多臺機器上?我如何在map/reduce job中訪問該文件?你能告訴我一個例子嗎? – Dude