2017-03-07 62 views
0

不知道爲什麼我得到此錯誤。我通過MBP上的brew來安裝hadoop 2.7.3。我想我在單節點運行它出於某種奇怪的原因在地圖縮減程序中獲取NumberFormatException

我問的一切都是從this hadoop tutorial site。我收到一個NumberFormatException錯誤,但它說它是「null」。

首先,這裏的輸入文件:

1979 23 23 2 43 24 25 26 26 26 26 25 26 25 
1980 26 27 28 28 28 30 31 31 31 30 30 30 29 
1981 31 32 32 32 33 34 35 36 36 34 34 34 34 
1984 39 38 39 39 39 41 42 43 40 39 38 38 40 
1985 38 39 39 39 39 41 41 41 00 40 39 39 45 

每個整數之間只有一個空格。唯一奇怪的是單個數字號碼,但這不是空的。

其次,這裏的錯誤消息,在運行程序時,我得到:

snip snip 
snip snip 
17/03/06 17:21:40 WARN mapred.LocalJobRunner: job_local1731001664_0001 
java.lang.Exception: java.lang.NumberFormatException: null 
    at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462) 
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522) 
Caused by: java.lang.NumberFormatException: null  // complains something is null here 
    at java.lang.Integer.parseInt(Integer.java:454) 
    at java.lang.Integer.parseInt(Integer.java:527) 
    at com.servicenow.bigdata.ProcessUtil$E_EMapper.map(ProcessUtil.java:35) 
    at com.servicenow.bigdata.ProcessUtil$E_EMapper.map(ProcessUtil.java:16) 
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:453) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) 
    at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:243) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 

snip snip 
snip snip 

最後,這裏是一個從問題的行/上述函數的代碼段:提前

public void map(LongWritable key, Text value, // offending line #16 here 
    OutputCollector<Text, IntWritable> output, 
    Reporter reporter) throws IOException 
    { 
    String line = value.toString(); 
    String lasttoken = null; 
    StringTokenizer s = new StringTokenizer(line,"\t"); 
    String year = s.nextToken(); 

    while(s.hasMoreTokens()) 
     { 
      lasttoken=s.nextToken(); 
     } 

    int avgprice = Integer.parseInt(lasttoken); // offneding #35 line here 
    output.collect(new Text(year), new IntWritable(avgprice)); 

感謝您的幫助。希望如果這是一個簡單的錯誤,我不會浪費人們的時間。

+1

似乎's.hasMoreTokens()'是從一開始'FALSE',因此'lasttoken'仍然'null',因此'NumberFormatException的:試圖解析它的時候null'。另外,如果每個數字之間有一個「空格」,並且您試圖用「標籤」分割標記,則不會有任何標記。 – jlordo

+0

@jlordo謝謝。我有空格而不是標籤b/c愚蠢的我,當我剪切粘貼,標籤變成了多個空間。在調試時,我刪除了所有空格,並沒有考慮將它製作成標籤。仍然沒有工作,但謝謝指出這一點給我。 – Classified

+0

@jlordo,如果你把你的評論變成答案,我會贊成它,因爲我很愚蠢,你指出我的錯誤。 – Classified

回答

1

替換所有的字符串的東西似乎s.hasMoreTokens()是從一開始假,因此lasttoken試圖解析它的時候仍然null,因此NumberFormatException: null。 此外,如果每個數字之間的空間' '和你想的標記與標籤'\t'分裂將不會有任何標記

1
  1. TutorialsPoint已過時的代碼。它告訴你下載Hadoop 1.2.1?那已經有幾年了......請查看官方的Hadoop MapReduce教程。
  2. 您在複製的數據中沒有製表符,只是空格。
  3. 您可以測試MapReduce外部相同的確切代碼。

你可以用這個

if (value == null) return null; 
String[] splits = value.toString().split("\\s+"); 
String year = splits[0]; 
String lasttoken = splits[splits.length - 1]; 
+0

thx,愚蠢的我。當我剪切和粘貼時,標籤變成了幾個空格。我試着擺弄空格,就像你說的那樣,沒有標記,因爲沒有標籤可以打開。 – Classified

+0

不用擔心。那麼這是否解決了你的問題? –

0
  1. 請確保您的文本文件只有空間的分隔符。
  2. 更改代碼如下所示。

    StringTokenizer s = new StringTokenizer(line,"\t");

相關問題