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"}