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 にパスまたは FSDataInputStream を与えることができません。HDFS で Avro ファイルを簡単に読み取るにはどうすればよいですか?

編集: SeekableInput を実装するカスタム クラス (SeekableHadoopInput) を作成することで、これを機能させました。これは github の「Ganglion」から「盗み」ました。それでも、これには Hadoop/Avro 統合パスがあるようです。

ありがとう

4

1 に答える 1

24

FsInputクラス (Hadoop に依存するため、avro-mapred サブモジュール内) でこれを行うことができます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 に答える