2016-10-13 3 views
0

ist ich eine CSV-DateiWie Karte nicht wissen, was der Schlüssel

Text habe | Text | Schlüssel | text | text
text | text | Schlüssel | text | text
text | text | Schlüssel | Text | Text
text | text | Schlüssel | text | text

und eine Java-Datei

import org.apache.hadoop.mapred.JobConf; 
import org.apache.hadoop.mapred.Mapper; 
import org.apache.hadoop.mapred.OutputCollector; 
import org.apache.hadoop.mapred.Reporter; 

public class MTransactionPerDay implements Mapper<WritableComparable, Text, Text, Text>{ 

    public void map(WritableComparable key, Text value, OutputCollector<Text, Text> outputCollector, Reporter reporter) throws IOException { 

    } 

Meine Frage ist. Wie kann ich der Kartenmethode mitteilen, dass das dritte Feld der Schlüssel ist?

bearbeiten

Dies löste mein Problem

public void map(WritableComparable key, Text value, OutputCollector<Text, Text> outputCollector, Reporter reporter) throws IOException { 
     //split string 
     String[] row = value.toString().split("[|]"); 
     //define key value pairs 
     Text keyString = new Text(row[3]); 
     Text valueString = new Text(row[2]); 
     //result 
     outputCollector.collect(keyString, valueString); 
    } 

Aber eine andere Frage aufgeworfen. Ich weiß, Map akzeptiert eine Datei und gibt Schlüssel/Wert-Paare zurück. Was ist das für dann WritableComparable Schlüssel?

In der Tat schrieb ich einen Test

@Test 
    public void testMapReduce() { 
     System.setProperty("hadoop.home.dir", "C:\\WorkSpace\\"); 
     mapReduceDriver.addInput(new LongWritable(1), new Text("0|9050000001|20160125204123")); 
     mapReduceDriver.addInput(new LongWritable(1), new Text("0|9050000001|20160125204123")); 
     mapReduceDriver.addInput(new LongWritable(1), new Text("0|9050000002|20160125204123")); 
     mapReduceDriver.addOutput(new Text("9050000001"), new IntWritable(2)); 
     mapReduceDriver.addOutput(new Text("9050000002"), new IntWritable(1)); 
     mapReduceDriver.runTest(); 
    } 

und musste fügen Sie diese dort

mapReduceDriver.addInput(new LongWritable(1), new Text("0|9050000001|20160125204123")); 

selbst dachte ich nie, dass die Schlüssel verwendet.

Antwort

0

Sie müssen benutzerdefinierten RecordReader implementieren. Beispiel: Hadoop hat einen Datensatzleser für TextInputFormat implementiert. Es liest Zeilen von Textdateien. Der Schlüssel, den es für jeden Datensatz ausgibt, ist der Byte-Offset der gelesenen Zeile (als LongWritable), und der Wert ist der Inhalt der Zeile bis zum abschließenden Zeichen '\ n' (als Text-Objekt).

Refer this to develop custom record reader

Verwandte Themen