2012-07-24 15 views
6

Sto provando a fare una semplice lettura di un file Avro archiviato in HDFS. Ho scoperto come leggerlo quando si trova sul file system locale ....Lettura di un semplice file Avro da 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(); 

Il mio file è in HDFS, tuttavia. Non posso dare openReader a Path o FSDataInputStream. Come posso leggere semplicemente un file Avro in HDFS?

EDIT: Ho ottenuto questo lavoro creando una classe personalizzata (SeekableHadoopInput) che implementa SeekableInput. Ho "rubato" questo da "Ganglion" su github. Comunque, sembra che ci sarebbe un percorso di integrazione Hadoop/Avro per questo.

Grazie

risposta

21

Il FsInput di classe (nel modulo avro-mapred, in quanto dipende Hadoop) può fare questo. Fornisce il flusso di input ricercabile necessario per i file di dati 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