2016-06-06 9 views
0

In meiner Mapper-Klasse möchte ich eine kleine Manipulation an einer aus einer Datei gelesenen Zeichenfolge vornehmen (als Zeile) und sie dann an den Reducer senden, um eine Zeichenkette zu erhalten . Die Manipulation ersetzen zu null Strings mit 0. (den aktuellen ersetzen & beitreten Teil meines hadoop Job versagt)String-Verkettung in der Mapper-Klasse eines MapReduce-Programms mit Fehlern

Hier ist mein Code:

import java.io.BufferedReader; 
import java.io.IOException; 
..... 

public class PartNumberMapper extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> { 
     private static Text partString = new Text(""); 

     private final static IntWritable count = new IntWritable(1); 

     public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { 

       String line = value.toString(); 

       // Read line by line to bufferreader and output the (line,count) pair 
       BufferedReader bufReader = new BufferedReader(new StringReader(line)); 
       String l=null; 
       while((l=bufReader.readLine()) != null) 
       { 
       /**** This part is the problem ****/ 
        String a[]=l.split(","); 
        if(a[1]==""){ // if a[1] i.e. second string is "" then set it to "0" 
          a[1]="0"; 
          l = StringUtils.join(",", a); // join the string array to form a string 
        } 
       /**** problematic part ends ****/ 

         partString.set(l); 
         output.collect(partString, count); 
       } 

     }  
} 

Danach läuft, nur der Mapper schlägt fehl, und doesn‘ t posten Sie irgendwelche Fehler. [Der Code wird mit Garn] Ich bin mir nicht sicher, was ich falsch mache, der gleiche Code funktioniert ohne den String Join Teil.

Könnte jemand von Ihnen erklären, was mit der Zeichenfolge ersetzen/concat falsch ist? Gibt es einen besseren Weg, es zu tun?

+0

Ich denke, L = StringUtils.join (",", a); ist falsch. Ändern Sie es in l = StringUtils.join (a, ','); – Koushik

+0

Folgendes habe ich angesprochen: ['join (CharSequence separator, String [] strings)'] (https://hadoop.apache.org/docs/r1.2.1/api/org/apache/hadoop/util/ StringUtils.html # join) –

+0

Sind Sie sicher, dass die Größe von Array a [] jedes Mal> = 2 ist? Wenn nicht, fügen Sie einen Scheck hinzu. – Koushik

Antwort

1

Hier ist eine modifizierte Version der Mapper-Klasse mit ein paar Änderungen:

  1. die BufferedReader entfernen, so scheint es überflüssig und wird nicht
  2. String Gleichheit sollte .equals() und nicht ==
  3. sein geschlossen deklarieren eine String-Array unter Verwendung von String[] und nicht String a[]

im folgenden Code Resultierende:

public class PartNumberMapper extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> { 

     private Text partString = new Text(); 
     private final static IntWritable count = new IntWritable(1); 

     public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { 

       String line = value.toString(); 
       String[] a = l.split(","); 

       if (a[1].equals("")) { 
        a[1] = "0"; 
        l = StringUtils.join(",", a); 
       } 

       partString.set(l); 
       output.collect(partString, count); 
     }  
}