2011-11-25 7 views
8

Tengo un archivo secuencial que es el resultado del trabajo hadoop map-reduce. En este archivo, los datos se escriben en pares de valores clave, y el valor en sí es un mapa. Quiero leer el valor como un objeto MAP para que pueda procesarlo más.¿Cómo se lee el archivo secuencial de 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"); 
    } 

salida del programa: Clave es: [esto es clave] valor es: {abc = 839177, xyz = 548 498, LMN = 2, PQR = 1} valor

Aquí estoy recibiendo como cadena , pero lo quiero como un objeto de mapa.

+0

¿De dónde viene 'val' from? Y un Mapa no es 'Writable', ¿qué estás usando para las clases en tu trabajo m/r? –

+0

Acabo de tener el archivo secuencial y no estoy al tanto de lo que están haciendo en el trabajo de reducción de mapa. Y se me proporciona la siguiente información. "Cada archivo debe abrirse como un archivo de secuencia. Se debe usar un códec de descompresión - la clase del archivo de secuencia parece ser capaz de decirle qué códec de compresión usar, y luego creo que cada clave y cada valor está codificado utilizando TypedBytes ". – samarth

+0

Luego debe obtener las clases de la clave y los valores, de lo contrario no los deserializará correctamente. –

Respuesta

6

Consulte la documentación de la API para SequenceFile#next(Writable, Writable)

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

debe sustituirse por

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

Uso SequenceFile.Reader#getValueClassName para obtener el tipo de valor en el SequenceFile. SequenceFile tiene los tipos clave/valor en el encabezado del archivo.

+0

Gracias, hombre, la clase de valor es "TypedBytesWritable" ¿puedo obtener el objeto del mapa de esta clase? – samarth

+1

[TypedBytesWritable # getValue] (http://hadoop.apache.org/mapreduce/docs/current/api/org/apache/hadoop/typedbytes/TypedBytesWritable.html#getValue%28%29) debería obtener el objeto. –

+0

Oye funcionó para mí .. Muchas gracias Praveen. – samarth

Cuestiones relacionadas