2011-11-25 15 views
8

Ho un file sequenziale che è l'output del lavoro di riduzione della mappa di hadoop. In questo file i dati sono scritti in coppie di valori chiave e il valore stesso è una mappa. Voglio leggere il valore come oggetto MAP in modo che possa elaborarlo ulteriormente.Come leggere il file sequenziale di hadoop?

Configuration config = new Configuration(); 
    Path path = new Path("D:\\OSP\\sample_data\\data\\part-00000"); 
    SequenceFile.Reader reader = new SequenceFile.Reader(FileSystem.get(config), path, config); 
    WritableComparable key = (WritableComparable) reader.getKeyClass().newInstance(); 
    Writable value = (Writable) reader.getValueClass().newInstance(); 
    long position = reader.getPosition(); 

    while(reader.next(key,value)) 
    { 
      System.out.println("Key is: "+textKey +" value is: "+val+"\n"); 
    } 

output del programma: Key è: [questo è la chiave] valore è: {abc = 839.177, xyz = 548.498, LMN = 2, PQR = 1} valore

Qui sto ottenendo come stringa , ma lo voglio come oggetto di mappa.

+0

Da dove viene 'val' da? E una mappa non è "scrivibile", cosa stai usando per le lezioni nel tuo lavoro di m/r? –

+0

Ho solo il file sequenziale e non sono a conoscenza di cosa stanno facendo nella mappa ridurre il lavoro.E vengono fornite le seguenti informazioni. "Ogni file di questo tipo deve essere aperto come un file di sequenza. È necessario utilizzare un codec decompressione - la classe del file di sequenza sembra essere in grado di dire a quale codec di compressione usare, e quindi penso che ogni chiave e ogni valore sia codificato usando TypedBytes. " – samarth

+0

Quindi devi ottenere le classi della chiave e dei valori, altrimenti non li deserializzi correttamente. –

risposta

6

Controllare la documentazione API per SequenceFile#next(Writable, Writable)

while(reader.next(key,value)) 
{ 
     System.out.println("Key is: "+textKey +" value is: "+val+"\n"); 
} 

dovrebbe essere sostituito con

while(reader.next(key,value)) 
{ 
     System.out.println("Key is: "+key +" value is: "+value+"\n"); 
} 

Usa SequenceFile.Reader#getValueClassName per ottenere il tipo di valore nel SequenceFile. SequenceFile ha i tipi chiave/valore nell'intestazione del file.

+0

Grazie man, la classe di valore è "TypedBytesWritable" posso ottenere l'oggetto mappa da questa classe? – samarth

+1

[TypedBytesWritable # getValue] (http://hadoop.apache.org/mapreduce/docs/current/api/org/apache/hadoop/typedbytes/TypedBytesWritable.html#getValue%28%29) dovrebbe ottenere l'oggetto. –

+0

Hey ha funzionato per me .. Grazie mille Praveen. – samarth