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.