6

我正在尝试简单读取存储在 HDFS 中的 Avro 文件。我发现了如何在本地文件系统上读取它....

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();

但是,我的文件在 HDFS 中。我不能给 openReader 一个 Path 或一个 FSDataInputStream。如何在 HDFS 中简单地读取 Avro 文件?

编辑:我通过创建一个实现 SeekableInput 的自定义类(SeekableHadoopInput)来实现这一点。我从 github 上的“Ganglion”“偷”了这个。尽管如此,似乎会有一个 Hadoop/Avro 集成路径。

谢谢

4

1 回答 1

24

FsInput类(在avro -mapred 子模块中,因为它依赖于 Hadoop)可以做到这一点。它提供了 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
于 2013-01-30T21:33:07.280 回答