2012-07-24 14 views
6

Próbuję wykonać prosty odczyt pliku Avro przechowywanego w HDFS. Dowiedziałem się, jak go odczytać, gdy znajduje się w lokalnym systemie plików ...Czytanie prostego pliku Avro z 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(); 

Mój plik jest jednak w HDFS. Nie mogę dać openReaderowi ścieżki ani FSDataInputStream. Jak mogę po prostu odczytać plik Avro w HDFS?

EDYCJA: Mam to do pracy, tworząc niestandardową klasę (SeekableHadoopInput), która implementuje SeekableInput. "Ukradłem" to z "Ganglion" na githubie. Nadal wydaje się, że istnieje ścieżka integracji Hadoop/Avro.

Dzięki

Odpowiedz

21

FsInput klasa (w modułem Avro-mapred, ponieważ zależy to od Hadoop) może to zrobić. Zapewnia on widzialny strumień wejściowy, który jest potrzebny do plików danych 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