这是从教程角度来看的反序列化器。
public class Deserialize {
public static void main(String args[]) throws Exception{
//Instantiating the Schema.Parser class.
Schema schema = new Schema.Parser().parse(new File("/home/Hadoop/Avro/schema/emp.avsc"));
DatumReader<GenericRecord> datumReader = new GenericDatumReader<GenericRecord>(schema);
DataFileReader<GenericRecord> dataFileReader = new DataFileReader<GenericRecord>(new File("/home/Hadoop/Avro_Work/without_code_gen/mydata.txt"), datumReader);
GenericRecord emp = null;
while (dataFileReader.hasNext()) {
emp = dataFileReader.next(emp);
System.out.println(emp);
}
System.out.println("hello");
}
}
我的问题是:如果.avro文件中已经有一个架构,为什么还必须传递该架构?我发现必须提供架构以解析文件非常不方便。
答案 0 :(得分:1)
Avro需要两个模式来进行解析-读取器模式和写入器模式。
writer模式包含在文件中。
您可以从文件中解析模式
String filepath = ...;
DataFileReader<Void> reader = new DataFileReader<>(Util.openSeekableFromFS(filepath),
new GenericDatumReader<>());
System.out.println(reader.getSchema().toString(true));
java -jar avro-tools.jar getschema
的工作方式
您可能需要使用Util.openSeekableFromFS
方法,因为它似乎是程序包私有的