AVRO - Sérialisation par classe de génération

On peut lire un schéma Avro dans le programme soit en générant une classe correspondant à un schéma soit en utilisant la bibliothèque d'analyseurs. Ce chapitre décrit comment lire le schémaby generating a class et Serializing les données en utilisant Avr.

Sérialisation en générant une classe

Pour sérialiser les données à l'aide d'Avro, suivez les étapes ci-dessous -

  • Écrivez un schéma Avro.

  • Compilez le schéma à l'aide de l'utilitaire Avro. Vous obtenez le code Java correspondant à ce schéma.

  • Remplissez le schéma avec les données.

  • Sérialisez-le à l'aide de la bibliothèque Avro.

Définition d'un schéma

Supposons que vous vouliez un schéma avec les détails suivants -

Field Nom id âge un salaire adresse
type Chaîne int int int chaîne

Créez un schéma Avro comme indiqué ci-dessous.

Enregistrez-le sous 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"}
   ]
}

Compiler le schéma

Après avoir créé un schéma Avro, vous devez compiler le schéma créé à l'aide des outils Avro. avro-tools-1.7.7.jar est le pot contenant les outils.

Syntaxe pour compiler un schéma Avro

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

Ouvrez le terminal dans le dossier de départ.

Créez un nouveau répertoire pour travailler avec Avro comme indiqué ci-dessous -

$ mkdir Avro_Work

Dans le répertoire nouvellement créé, créez trois sous-répertoires -

  • Premier nommé schema, pour placer le schéma.

  • Deuxième nommé with_code_gen, pour placer le code généré.

  • Troisième nommé jars, pour placer les fichiers jar.

$ mkdir schema
$ mkdir with_code_gen
$ mkdir jars

La capture d'écran suivante montre comment votre Avro_work Le dossier doit ressembler à après avoir créé tous les répertoires.

  • Maintenant /home/Hadoop/Avro_work/jars/avro-tools-1.7.7.jar est le chemin du répertoire dans lequel vous avez téléchargé le fichier avro-tools-1.7.7.jar.

  • /home/Hadoop/Avro_work/schema/ est le chemin du répertoire dans lequel votre fichier de schéma emp.avsc est stocké.

  • /home/Hadoop/Avro_work/with_code_gen est le répertoire dans lequel vous souhaitez stocker les fichiers de classe générés.

Maintenant, compilez le schéma comme indiqué ci-dessous -

$ 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

Après la compilation, un package en fonction de l'espace de nom du schéma est créé dans le répertoire de destination. Dans ce package, le code source Java avec le nom du schéma est créé. Ce code source généré est le code Java du schéma donné qui peut être utilisé directement dans les applications.

Par exemple, dans ce cas, un package / dossier, nommé tutorialspoint est créé qui contient un autre dossier nommé com (puisque l'espace de nom est tutorialspoint.com) et à l'intérieur de celui-ci, vous pouvez observer le fichier généré emp.java. L'instantané suivant montreemp.java -

Cette classe est utile pour créer des données selon le schéma.

La classe générée contient -

  • Constructeur par défaut et constructeur paramétré qui acceptent toutes les variables du schéma.
  • Les méthodes setter et getter pour toutes les variables du schéma.
  • Get () méthode qui renvoie le schéma.
  • Méthodes du constructeur.

Création et sérialisation des données

Tout d'abord, copiez le fichier java généré utilisé dans ce projet dans le répertoire courant ou importez-le d'où il se trouve.

Nous pouvons maintenant écrire un nouveau fichier Java et instancier la classe dans le fichier généré (emp) pour ajouter les données des employés au schéma.

Voyons la procédure pour créer des données selon le schéma à l'aide d'apache Avro.

Étape 1

Instancier le généré emp classe.

emp e1=new emp( );

Étape 2

En utilisant des méthodes de setter, insérez les données du premier employé. Par exemple, nous avons créé les coordonnées de l'employé nommé Omar.

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

De même, remplissez tous les détails de l'employé à l'aide des méthodes de définition.

Étape 3

Créer un objet de DatumWriter interface utilisant le SpecificDatumWriterclasse. Cela convertit les objets Java en un format sérialisé en mémoire. L'exemple suivant instancieSpecificDatumWriter objet de classe pour emp classe.

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

Étape 4

Instancier DataFileWriter pour empclasse. Cette classe écrit une séquence d'enregistrements sérialisés de données conformes à un schéma, avec le schéma lui-même, dans un fichier. Cette classe nécessite leDatumWriter object, en tant que paramètre du constructeur.

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

Étape 5

Ouvrez un nouveau fichier pour stocker les données correspondant au schéma donné en utilisant create()méthode. Cette méthode requiert le schéma et le chemin du fichier dans lequel les données doivent être stockées en tant que paramètres.

Dans l'exemple suivant, le schéma est transmis à l'aide de getSchema() méthode, et le fichier de données est stocké dans le chemin - /home/Hadoop/Avro/serialized_file/emp.avro.

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

Étape 6

Ajoutez tous les enregistrements créés au fichier en utilisant append() méthode comme indiqué ci-dessous -

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

Exemple - Sérialisation en générant une classe

Le programme complet suivant montre comment sérialiser des données dans un fichier à l'aide d'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");
   }
}

Parcourez le répertoire dans lequel le code généré est placé. Dans ce cas, àhome/Hadoop/Avro_work/with_code_gen.

In Terminal −

$ cd home/Hadoop/Avro_work/with_code_gen/

In GUI −

Maintenant, copiez et enregistrez le programme ci-dessus dans le fichier nommé Serialize.java

Compilez et exécutez-le comme indiqué ci-dessous -

$ javac Serialize.java
$ java Serialize

Production

data successfully serialized

Si vous vérifiez le chemin indiqué dans le programme, vous pouvez trouver le fichier sérialisé généré comme indiqué ci-dessous.