AVRO - Serializzazione mediante generazione di classi

È possibile leggere uno schema Avro nel programma generando una classe corrispondente a uno schema o utilizzando la libreria parser. Questo capitolo descrive come leggere lo schemaby generating a class e Serializing i dati utilizzando Avr.

Serializzazione generando una classe

Per serializzare i dati utilizzando Avro, seguire i passaggi indicati di seguito:

  • Scrivi uno schema Avro.

  • Compilare lo schema utilizzando l'utilità Avro. Ottieni il codice Java corrispondente a quello schema.

  • Popolare lo schema con i dati.

  • Serializzalo usando la libreria Avro.

Definizione di uno schema

Supponi di volere uno schema con i seguenti dettagli:

Field Nome id età stipendio indirizzo
type Corda int int int corda

Crea uno schema Avro come mostrato di seguito.

Salvalo come 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"}
   ]
}

Compilazione dello schema

Dopo aver creato uno schema Avro, è necessario compilare lo schema creato utilizzando gli strumenti Avro. avro-tools-1.7.7.jar è il barattolo contenente gli strumenti.

Sintassi per compilare uno schema Avro

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

Apri il terminale nella cartella home.

Crea una nuova directory per lavorare con Avro come mostrato di seguito -

$ mkdir Avro_Work

Nella directory appena creata, crea tre sottodirectory:

  • Primo nome schema, per posizionare lo schema.

  • Secondo nome with_code_gen, per posizionare il codice generato.

  • Terzo nome jars, per posizionare i file jar.

$ mkdir schema
$ mkdir with_code_gen
$ mkdir jars

Lo screenshot seguente mostra come il tuo Avro_work la cartella dovrebbe apparire come dopo aver creato tutte le directory.

  • Adesso /home/Hadoop/Avro_work/jars/avro-tools-1.7.7.jar è il percorso della directory in cui è stato scaricato il file avro-tools-1.7.7.jar.

  • /home/Hadoop/Avro_work/schema/ è il percorso della directory in cui è archiviato il file di schema emp.avsc.

  • /home/Hadoop/Avro_work/with_code_gen è la directory in cui desideri memorizzare i file di classe generati.

Ora compila lo schema come mostrato di seguito -

$ 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

Dopo la compilazione, nella directory di destinazione viene creato un pacchetto in base allo spazio dei nomi dello schema. All'interno di questo pacchetto, viene creato il codice sorgente Java con il nome dello schema. Questo codice sorgente generato è il codice Java dello schema dato che può essere utilizzato direttamente nelle applicazioni.

Ad esempio, in questo caso un pacchetto / cartella, denominato tutorialspoint viene creata che contiene un'altra cartella denominata com (poiché lo spazio dei nomi è tutorialspoint.com) e al suo interno è possibile osservare il file generato emp.java. La seguente istantanea mostraemp.java -

Questa classe è utile per creare dati secondo lo schema.

La classe generata contiene -

  • Costruttore predefinito e costruttore parametrizzato che accetta tutte le variabili dello schema.
  • I metodi setter e getter per tutte le variabili nello schema.
  • Metodo Get () che restituisce lo schema.
  • Metodi del costruttore.

Creazione e serializzazione dei dati

Prima di tutto, copia il file java generato utilizzato in questo progetto nella directory corrente o importalo da dove si trova.

Ora possiamo scrivere un nuovo file Java e istanziare la classe nel file generato (emp) per aggiungere i dati dei dipendenti allo schema.

Vediamo la procedura per creare dati secondo lo schema utilizzando apache Avro.

Passo 1

Istanziare il generato emp classe.

emp e1=new emp( );

Passo 2

Utilizzando i metodi setter, inserire i dati del primo impiegato. Ad esempio, abbiamo creato i dettagli del dipendente di nome Omar.

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

Allo stesso modo, inserisci tutti i dettagli del dipendente utilizzando i metodi setter.

Passaggio 3

Crea un oggetto di DatumWriter l'interfaccia utilizzando il SpecificDatumWriterclasse. Questo converte gli oggetti Java in un formato serializzato in memoria. L'esempio seguente crea un'istanzaSpecificDatumWriter oggetto di classe per emp classe.

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

Passaggio 4

Istanziare DataFileWriter per empclasse. Questa classe scrive una sequenza di record serializzati di dati conformi a uno schema, insieme allo schema stesso, in un file. Questa classe richiede ilDatumWriter oggetto, come parametro per il costruttore.

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

Passaggio 5

Apri un nuovo file per memorizzare i dati corrispondenti allo schema specificato utilizzando create()metodo. Questo metodo richiede lo schema e il percorso del file in cui devono essere memorizzati i dati, come parametri.

Nell'esempio seguente, lo schema viene passato utilizzando getSchema() metodo e il file di dati viene memorizzato nel percorso - /home/Hadoop/Avro/serialized_file/emp.avro.

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

Passaggio 6

Aggiungi tutti i record creati al file utilizzando append() metodo come mostrato di seguito -

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

Esempio: serializzazione mediante generazione di una classe

Il seguente programma completo mostra come serializzare i dati in un file utilizzando 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");
   }
}

Sfoglia la directory in cui si trova il codice generato. In questo caso, ahome/Hadoop/Avro_work/with_code_gen.

In Terminal −

$ cd home/Hadoop/Avro_work/with_code_gen/

In GUI −

Ora copia e salva il programma sopra nel file denominato Serialize.java

Compilalo ed eseguilo come mostrato di seguito -

$ javac Serialize.java
$ java Serialize

Produzione

data successfully serialized

Se verifichi il percorso fornito nel programma, puoi trovare il file serializzato generato come mostrato di seguito.