AVRO - desserialização usando analisadores
Como mencionado anteriormente, pode-se ler um esquema Avro em um programa gerando uma classe correspondente a um esquema ou usando a biblioteca de analisadores. No Avro, os dados são sempre armazenados com seu esquema correspondente. Portanto, sempre podemos ler um item serializado sem geração de código.
Este capítulo descreve como ler o esquema using parsers library e Deserializing os dados usando Avro.
Desserialização usando a biblioteca de analisadores
Os dados serializados são armazenados no arquivo mydata.txt. Você pode desserializar e ler usando Avro.
Siga o procedimento fornecido a seguir para desserializar os dados serializados de um arquivo.
Passo 1
Em primeiro lugar, leia o esquema do arquivo. Para fazer isso, useSchema.Parserclasse. Esta classe fornece métodos para analisar o esquema em diferentes formatos.
Instancie o Schema.Parser classe passando o caminho do arquivo onde o esquema está armazenado.
Schema schema = new Schema.Parser().parse(new File("/path/to/emp.avsc"));
Passo 2
Crie um objeto de DatumReader interface usando SpecificDatumReader classe.
DatumReader<emp>empDatumReader = new SpecificDatumReader<emp>(emp.class);
etapa 3
Instanciar DataFileReaderclasse. Esta classe lê dados serializados de um arquivo. Requer oDatumReader objeto e caminho do arquivo onde os dados serializados existem, como um parâmetro para o construtor.
DataFileReader<GenericRecord> dataFileReader = new DataFileReader<GenericRecord>(new File("/path/to/mydata.txt"), datumReader);
Passo 4
Imprima os dados desserializados, usando os métodos de DataFileReader.
o hasNext() método retorna um booleano se houver algum elemento no Reader.
o next() método de DataFileReader retorna os dados no Reader.
while(dataFileReader.hasNext()){
em=dataFileReader.next(em);
System.out.println(em);
}
Exemplo - desserialização usando a biblioteca de analisadores
O programa completo a seguir mostra como desserializar os dados serializados usando a biblioteca Parsers -
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");
}
}
Navegue até o diretório onde o código gerado é colocado. Neste caso, é emhome/Hadoop/Avro_work/without_code_gen.
$ cd home/Hadoop/Avro_work/without_code_gen/
Agora copie e salve o programa acima no arquivo chamado DeSerialize.java. Compile e execute-o conforme mostrado abaixo -
$ javac Deserialize.java
$ java Deserialize
Resultado
{"name": "ramu", "id": 1, "salary": 30000, "age": 25, "address": "chennai"}
{"name": "rahman", "id": 2, "salary": 35000, "age": 30, "address": "Delhi"}