2012-07-24 47 views
6

Estoy tratando de hacer una simple lectura de un archivo Avro almacenado en HDFS. Descubrí cómo leerlo cuando está en el sistema de archivos local ...Lectura de un archivo Avro simple desde HDFS

FileReader reader = DataFileReader.openReader(new File(filename), new GenericDatumReader()); 

for (GenericRecord datum : fileReader) { 
    String value = datum.get(1).toString(); 
    System.out.println("value = " value); 
} 

reader.close(); 

Mi archivo está en HDFS, sin embargo. No puedo darle a openReader una ruta o un FSDataInputStream. ¿Cómo puedo simplemente leer un archivo Avro en HDFS?

EDITAR: Obtuve esto para crear una clase personalizada (SeekableHadoopInput) que implementa SeekableInput. "Robé" esto de "Ganglion" en github. Aún así, parece que habría una ruta de integración de Hadoop/Avro para esto.

Gracias

Respuesta

21

El FsInput clase (en el submódulo Avro-mapred, ya que depende de Hadoop) puede hacer esto. Proporciona el flujo de entrada buscable que se necesita para los archivos de datos Avro.

Path path = new Path("/path/on/hdfs"); 
Configuration config = new Configuration(); // make this your Hadoop env config 
SeekableInput input = new FsInput(path, config); 
DatumReader<GenericRecord> reader = new GenericDatumReader<GenericRecord>(); 
FileReader<GenericRecord> fileReader = DataFileReader.openReader(input, reader); 

for (GenericRecord datum : fileReader) { 
    System.out.println("value = " + datum); 
} 

fileReader.close(); // also closes underlying FsInput 
Cuestiones relacionadas