AVRO - Serialização por classe de geração

Pode-se ler um esquema Avro no programa gerando uma classe correspondente a um esquema ou usando a biblioteca de analisadores. Este capítulo descreve como ler o esquemaby generating a class e Serializing os dados usando o Avr.

Serialização pela geração de uma classe

Para serializar os dados usando Avro, siga as etapas fornecidas abaixo -

  • Escreva um esquema Avro.

  • Compile o esquema usando o utilitário Avro. Você obtém o código Java correspondente a esse esquema.

  • Preencha o esquema com os dados.

  • Serialize-o usando a biblioteca Avro.

Definindo um Esquema

Suponha que você queira um esquema com os seguintes detalhes -

Field Nome Eu iria era salário endereço
type Corda int int int corda

Crie um esquema Avro conforme mostrado abaixo.

Salvar como emp.avsc.

{
   "namespace": "tutorialspoint.com",
   "type": "record",
   "name": "emp",
   "fields": [
      {"name": "name", "type": "string"},
      {"name": "id", "type": "int"},
      {"name": "salary", "type": "int"},
      {"name": "age", "type": "int"},
      {"name": "address", "type": "string"}
   ]
}

Compilando o Esquema

Depois de criar um esquema Avro, você precisa compilar o esquema criado usando ferramentas Avro. avro-tools-1.7.7.jar é o jarro que contém as ferramentas.

Sintaxe para compilar um esquema Avro

java -jar <path/to/avro-tools-1.7.7.jar> compile schema <path/to/schema-file> <destination-folder>

Abra o terminal na pasta inicial.

Crie um novo diretório para trabalhar com Avro, conforme mostrado abaixo -

$ mkdir Avro_Work

No diretório recém-criado, crie três subdiretórios -

  • Primeiro nomeado schema, para colocar o esquema.

  • Segundo nome with_code_gen, para colocar o código gerado.

  • Terceiro nomeado jars, para colocar os arquivos jar.

$ mkdir schema
$ mkdir with_code_gen
$ mkdir jars

A captura de tela a seguir mostra como seu Avro_work pasta deve ficar parecida após a criação de todos os diretórios.

  • Agora /home/Hadoop/Avro_work/jars/avro-tools-1.7.7.jar é o caminho para o diretório onde você baixou o arquivo avro-tools-1.7.7.jar.

  • /home/Hadoop/Avro_work/schema/ é o caminho para o diretório onde o arquivo de esquema emp.avsc está armazenado.

  • /home/Hadoop/Avro_work/with_code_gen é o diretório onde você deseja que os arquivos de classe gerados sejam armazenados.

Agora compile o esquema conforme mostrado abaixo -

$ java -jar /home/Hadoop/Avro_work/jars/avro-tools-1.7.7.jar compile schema /home/Hadoop/Avro_work/schema/emp.avsc /home/Hadoop/Avro/with_code_gen

Após a compilação, um pacote de acordo com o espaço de nomes do esquema é criado no diretório de destino. Dentro deste pacote, o código-fonte Java com o nome do esquema é criado. Este código-fonte gerado é o código Java do esquema fornecido, que pode ser usado diretamente nos aplicativos.

Por exemplo, neste caso, um pacote / pasta, denominado tutorialspoint é criado, o qual contém outra pasta chamada com (já que o namespace é tutorialspoint.com) e dentro dela, você pode observar o arquivo gerado emp.java. O instantâneo a seguir mostraemp.java -

Esta classe é útil para criar dados de acordo com o esquema.

A classe gerada contém -

  • Construtor padrão e construtor parametrizado que aceita todas as variáveis ​​do esquema.
  • Os métodos setter e getter para todas as variáveis ​​no esquema.
  • Método Get () que retorna o esquema.
  • Métodos Builder.

Criação e serialização dos dados

Em primeiro lugar, copie o arquivo java gerado usado neste projeto para o diretório atual ou importe-o de onde ele está localizado.

Agora podemos escrever um novo arquivo Java e instanciar a classe no arquivo gerado (emp) para adicionar dados de funcionários ao esquema.

Vamos ver o procedimento para criar dados de acordo com o esquema usando o apache Avro.

Passo 1

Instancie o gerado emp classe.

emp e1=new emp( );

Passo 2

Usando métodos setter, insira os dados do primeiro funcionário. Por exemplo, criamos os detalhes do funcionário chamado Omar.

e1.setName("omar");
e1.setAge(21);
e1.setSalary(30000);
e1.setAddress("Hyderabad");
e1.setId(001);

Da mesma forma, preencha todos os detalhes do funcionário usando métodos setter.

etapa 3

Crie um objeto de DatumWriter interface usando o SpecificDatumWriterclasse. Isso 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);

Passo 4

Instanciar DataFileWriter para empclasse. Essa classe grava uma seqüência de 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> empFileWriter = new DataFileWriter<emp>(empDatumWriter);

Etapa 5

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 a seguir, 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 6

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

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

Exemplo - serialização gerando uma classe

O seguinte programa completo mostra como serializar dados em um arquivo usando o Apache Avro -

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

import org.apache.avro.file.DataFileWriter;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.specific.SpecificDatumWriter;

public class Serialize {
   public static void main(String args[]) throws IOException{
	
      //Instantiating generated emp class
      emp e1=new emp();
	
      //Creating values according the schema
      e1.setName("omar");
      e1.setAge(21);
      e1.setSalary(30000);
      e1.setAddress("Hyderabad");
      e1.setId(001);
	
      emp e2=new emp();
	
      e2.setName("ram");
      e2.setAge(30);
      e2.setSalary(40000);
      e2.setAddress("Hyderabad");
      e2.setId(002);
	
      emp e3=new emp();
	
      e3.setName("robbin");
      e3.setAge(25);
      e3.setSalary(35000);
      e3.setAddress("Hyderabad");
      e3.setId(003);
	
      //Instantiate DatumWriter class
      DatumWriter<emp> empDatumWriter = new SpecificDatumWriter<emp>(emp.class);
      DataFileWriter<emp> empFileWriter = new DataFileWriter<emp>(empDatumWriter);
	
      empFileWriter.create(e1.getSchema(), new File("/home/Hadoop/Avro_Work/with_code_gen/emp.avro"));
	
      empFileWriter.append(e1);
      empFileWriter.append(e2);
      empFileWriter.append(e3);
	
      empFileWriter.close();
	
      System.out.println("data successfully serialized");
   }
}

Navegue pelo diretório onde o código gerado é colocado. Neste caso, emhome/Hadoop/Avro_work/with_code_gen.

In Terminal −

$ cd home/Hadoop/Avro_work/with_code_gen/

In GUI −

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.