AVRO - Sérialisation à l'aide d'analyseurs

On peut lire un schéma Avro dans un programme soit en générant une classe correspondant à un schéma soit en utilisant la bibliothèque d'analyseurs. Dans Avro, les données sont toujours stockées avec leur schéma correspondant. Par conséquent, nous pouvons toujours lire un schéma sans génération de code.

Ce chapitre décrit comment lire le schéma by using parsers library et à serialize les données en utilisant Avro.

Sérialisation à l'aide de la bibliothèque d'analyseurs

Pour sérialiser les données, nous devons lire le schéma, créer des données selon le schéma et sérialiser le schéma à l'aide de l'API Avro. La procédure suivante sérialise les données sans générer de code -

Étape 1

Tout d'abord, lisez le schéma à partir du fichier. Pour ce faire, utilisezSchema.Parserclasse. Cette classe fournit des méthodes pour analyser le schéma dans différents formats.

Instancier le Schema.Parser class en passant le chemin du fichier où le schéma est stocké.

Schema schema = new Schema.Parser().parse(new File("/path/to/emp.avsc"));

Étape 2

Créer l'objet de GenericRecord interface, en instanciant GenericData.Recordclasse comme indiqué ci-dessous. Passez l'objet de schéma créé ci-dessus à son constructeur.

GenericRecord e1 = new GenericData.Record(schema);

Étape 3

Insérez les valeurs dans le schéma à l'aide du put() méthode de la GenericData classe.

e1.put("name", "ramu");
e1.put("id", 001);
e1.put("salary",30000);
e1.put("age", 25);
e1.put("address", "chennai");

Étape 4

Créer un objet de DatumWriter interface utilisant le SpecificDatumWriterclasse. Il 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 5

Instancier DataFileWriter pour empclasse. Cette classe écrit des 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> dataFileWriter = new DataFileWriter<emp>(empDatumWriter);

Étape 6

Ouvrez un nouveau fichier pour stocker les données correspondant au schéma donné en utilisant create()méthode. Cette méthode nécessite 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 ci-dessous, le schéma est passé en utilisant 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 7

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 à l'aide d'analyseurs

Le programme complet suivant montre comment sérialiser les données à l'aide d'analyseurs -

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

import org.apache.avro.Schema;
import org.apache.avro.file.DataFileWriter;

import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericDatumWriter;
import org.apache.avro.generic.GenericRecord;

import org.apache.avro.io.DatumWriter;

public class Seriali {
   public static void main(String args[]) throws IOException{
	
      //Instantiating the Schema.Parser class.
      Schema schema = new Schema.Parser().parse(new File("/home/Hadoop/Avro/schema/emp.avsc"));
		
      //Instantiating the GenericRecord class.
      GenericRecord e1 = new GenericData.Record(schema);
		
      //Insert data according to schema
      e1.put("name", "ramu");
      e1.put("id", 001);
      e1.put("salary",30000);
      e1.put("age", 25);
      e1.put("address", "chenni");
		
      GenericRecord e2 = new GenericData.Record(schema);
		
      e2.put("name", "rahman");
      e2.put("id", 002);
      e2.put("salary", 35000);
      e2.put("age", 30);
      e2.put("address", "Delhi");
		
      DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<GenericRecord>(schema);
		
      DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<GenericRecord>(datumWriter);
      dataFileWriter.create(schema, new File("/home/Hadoop/Avro_work/without_code_gen/mydata.txt"));
		
      dataFileWriter.append(e1);
      dataFileWriter.append(e2);
      dataFileWriter.close();
		
      System.out.println(“data successfully serialized”);
   }
}

Naviguez dans le répertoire où le code généré est placé. Dans ce cas, àhome/Hadoop/Avro_work/without_code_gen.

$ cd home/Hadoop/Avro_work/without_code_gen/

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.