2013-02-19 57 views
0

我最近開始在hadoop中工作,並且剛剛學習了一些關於它的基本理論知識。我試圖解決一個任務,其中輸入將在文本文件中給出,例如input.txt(1 10 37 5 4 98 100等)使用(java編程)在hadoop中查找最大整數值

我需要找到給定輸入中的最大整數(即整型)。我試圖在arraylist中傳遞輸入,以便可以將第一個整數與所有整數的其餘部分進行比較(使用for-loop)。

1)是否可以通過這種方式找到解決方案?如果是的話,我不能在hadoop這裏創建一個數組列表,並且需要一些提示:-)

2)我們可以只打印'key'而不是鍵值對嗎?如果有,請幫助我。我試圖編碼減少功能不打印它,但我得到一些錯誤。

請引導我一些提示,我可以繼續前進。謝謝

回答

0

爲此,你最好有一個減速器。

爲了保證所有的號碼來獲得相同的減速機,你必須做兩件事情:

  1. :發射的映射
  2. 設置reduce任務爲零的所有輸入值相同的密鑰。

map()方法可能看起來像以下:

@Override 
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 
      context.write(new Text("MyAwesomeKey"), key); // assuming that your number is being read in the key 
      } 

在你Reduce類,有一個屬性max,是這樣的: Long max

而且reduce()方法可能看起來像以下:

@Override 
public void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException { 
      context.write(new Text("MyAwesomeKey"), key); // assuming that your number is being read in the key 
      } 

然後覆蓋run()也爲我們覆蓋reduce()

public void run(Context context) throws IOException, InterruptedException { 
    setup(context); 
    while (context.nextKey()) { 
     reduce(context.getCurrentKey(), context.getValues(), context); 
    } 
    context.write(new LongWritable(max),new Text("")); // write the max value 
    cleanup(context); 
    } 

要設置減少任務之一,請執行下列操作在你的工作的run(),注意,這是由上述run()不同:

job.setNumReduceTasks(1); 

注意:以上代碼均遵循新的mapreduce API,我相信使用舊的mapred API,我們將無法在減速機完成作業後獲得單點掛鉤,因爲我們可以通過重寫Reducer的run()來完成。

+0

非常感謝你的回覆。我會努力工作,我會讓你知道的。謝謝。 – user2085189 2013-02-20 00:48:26

0

在您的地圖步驟中,您可以將所有數字映射到單個鍵。然後在減少步驟中,您可以取最大值。 reduce步驟將傳遞給定鍵的迭代值集合 - 不需要創建自己的ArrayList。

+0

非常感謝你的回覆。我會努力工作,我會讓你知道的。謝謝。 – user2085189 2013-02-20 00:49:46