AVRO - Serialização usando analisadores

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 esquema sem geração de código.

Este capítulo descreve como ler o esquema by using parsers library e para serialize os dados usando Avro.

Serialização usando a biblioteca de analisadores

Para serializar os dados, precisamos ler o esquema, criar dados de acordo com o esquema e serializar o esquema usando a API Avro. O procedimento a seguir serializa os dados sem gerar nenhum código -

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 o objeto de GenericRecord interface, instanciando GenericData.Recordclasse como mostrado abaixo. Passe o objeto de esquema criado acima para seu construtor.

GenericRecord e1 = new GenericData.Record(schema);

etapa 3

Insira os valores no esquema usando o put() método do GenericData classe.

e1.put("name", "ramu");
e1.put("id", 001);
e1.put("salary",30000);
e1.put("age", 25);
e1.put("address", "chennai");

Passo 4

Crie um objeto de DatumWriter interface usando o SpecificDatumWriterclasse. Ele converte objetos Java em formato serializado na memória. O exemplo a seguir instanciaSpecificDatumWriter objeto de classe para emp classe -

DatumWriter<emp> empDatumWriter = new SpecificDatumWriter<emp>(emp.class);

Etapa 5

Instanciar DataFileWriter para empclasse. Essa classe grava registros serializados de dados em conformidade com um esquema, junto com o próprio esquema, em um arquivo. Esta aula requer oDatumWriter objeto, como um parâmetro para o construtor.

DataFileWriter<emp> dataFileWriter = new DataFileWriter<emp>(empDatumWriter);

Etapa 6

Abra um novo arquivo para armazenar os dados correspondentes ao esquema fornecido usando create()método. Este método requer o esquema e o caminho do arquivo onde os dados devem ser armazenados como parâmetros.

No exemplo abaixo, o esquema é passado usando getSchema() método e o arquivo de dados é armazenado no caminho

/home/Hadoop/Avro/serialized_file/emp.avro.

empFileWriter.create(e1.getSchema(), new
File("/home/Hadoop/Avro/serialized_file/emp.avro"));

Etapa 7

Adicione todos os registros criados ao arquivo usando append( ) método conforme mostrado abaixo.

empFileWriter.append(e1);
empFileWriter.append(e2);
empFileWriter.append(e3);

Exemplo - serialização usando analisadores

O programa completo a seguir mostra como serializar os dados usando analisadores -

import java.io.File;
import java.io.IOException;

import org.apache.avro.Schema;
import org.apache.avro.file.DataFileWriter;

import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericDatumWriter;
import org.apache.avro.generic.GenericRecord;

import org.apache.avro.io.DatumWriter;

public class Seriali {
   public static void main(String args[]) throws IOException{
	
      //Instantiating the Schema.Parser class.
      Schema schema = new Schema.Parser().parse(new File("/home/Hadoop/Avro/schema/emp.avsc"));
		
      //Instantiating the GenericRecord class.
      GenericRecord e1 = new GenericData.Record(schema);
		
      //Insert data according to schema
      e1.put("name", "ramu");
      e1.put("id", 001);
      e1.put("salary",30000);
      e1.put("age", 25);
      e1.put("address", "chenni");
		
      GenericRecord e2 = new GenericData.Record(schema);
		
      e2.put("name", "rahman");
      e2.put("id", 002);
      e2.put("salary", 35000);
      e2.put("age", 30);
      e2.put("address", "Delhi");
		
      DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<GenericRecord>(schema);
		
      DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<GenericRecord>(datumWriter);
      dataFileWriter.create(schema, new File("/home/Hadoop/Avro_work/without_code_gen/mydata.txt"));
		
      dataFileWriter.append(e1);
      dataFileWriter.append(e2);
      dataFileWriter.close();
		
      System.out.println(“data successfully serialized”);
   }
}

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 Serialize.java. Compile e execute-o conforme mostrado abaixo -

$ javac Serialize.java
$ java Serialize

Resultado

data successfully serialized

Se você verificar o caminho fornecido no programa, poderá encontrar o arquivo serializado gerado conforme mostrado abaixo.