AVRO - Serialização por classe geradora

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 esquema gerando uma classe e serializando os dados usando o Avr.

<span class = Serialização Avro WithCode "/>

Serialização gerando uma classe

Para serializar os dados usando o Avro , siga as etapas 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 -

Campo Nome Eu iria era salário endereço
tipo Corda int int int corda

Crie um esquema Avro como mostrado abaixo.

Salve-o como emp.avsc .

{
   "namespace": "it-brain.online",
   "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

Após criar um esquema Avro , você precisa compilar o esquema criado usando as ferramentas Avro . avro-tools-1.7.7.jar é o jar 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 o Avro como mostrado abaixo -

$ mkdir Avro _Work

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

  • Primeiro nome do esquema, para colocar o esquema.

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

  • Terceiros jarros nomeados , para colocar os arquivos jar.

$ mkdir schema
$ mkdir with_code_gen
$ mkdir jars

A captura de tela a seguir mostra a aparência da pasta Avro _work após a criação de todos os diretórios.

<span class = Trabalho Avro "/>
  • Agora, / home / Hadoop / Avro _work / jars / avro-tools-1.7.7.jar é o caminho para o diretório em que você baixou o arquivo avro-tools-1.7.7.jar.

  • / home / Hadoop / Avro _work / schema / é o caminho para o diretório em que o arquivo de esquema emp.avsc está armazenado.

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

Agora compile o esquema como 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 para nome do esquema é criado no diretório de destino. Dentro deste pacote, o código-fonte Java com o nome do esquema é criado. Esse código-fonte gerado é o código Java do esquema especificado que pode ser usado diretamente nos aplicativos.

Por exemplo, nesse caso, é criado um pacote / pasta chamado tutorialspoint que contém outra pasta chamada com (já que o espaço de nome é it-brain.online) e dentro dela, é possível observar o arquivo gerado emp.java . O instantâneo a seguir mostra emp.java -

Instantâneo do programa de amostra

Essa 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.
  • Get () método que retorna o esquema.
  • Métodos de construtor.

Criando e serializando os dados

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

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

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

Passo 1

Instanciar a classe emp gerada.

emp e1=new emp( );

Passo 2

Usando métodos de 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 dos funcionários usando métodos de instalação.

etapa 3

Crie um objeto da interface DatumWriter usando a classe SpecificDatumWriter . Isso converte objetos Java em formato serializado na memória. O exemplo a seguir instancia o objeto de classe SpecificDatumWriter para a classe emp .

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

Passo 4

Instanciar DataFileWriter para a classe emp . Essa classe grava uma seqüência de registros serializados de dados em conformidade com um esquema, juntamente com o próprio esquema, em um arquivo. Esta classe requer o objeto DatumWriter , 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 especificado usando o método create () . Este método requer o esquema e o caminho do arquivo em que os dados devem ser armazenados, como parâmetros.

No exemplo a seguir, o esquema é passado usando o método getSchema () 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 o método append () , como mostrado abaixo -

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

Exemplo - serialização gerando uma classe

O programa completo a seguir 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 em que o código gerado é colocado. Nesse caso, em casa / Hadoop / Avro _work / with_code_gen .

No terminal -

$ cd home/Hadoop/ Avro _work/with_code_gen/

Na GUI -

Código Gerado

Agora copie e salve o programa acima no arquivo chamado Serialize.java

Compile e execute-o como 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, como mostrado abaixo.

Arquivo serializado gerado