AVRO - Serializacja przy użyciu parserów

Schemat Avro można wczytać do programu, generując klasę odpowiadającą schematowi lub korzystając z biblioteki parserów. W Avro dane są zawsze przechowywane wraz z odpowiednim schematem. Dlatego zawsze możemy odczytać schemat bez generowania kodu.

W tym rozdziale opisano, jak czytać schemat by using parsers library i do serialize dane za pomocą Avro.

Serializacja przy użyciu biblioteki parserów

Aby serializować dane, musimy odczytać schemat, utworzyć dane zgodnie ze schematem i serializować schemat za pomocą Avro API. Poniższa procedura serializuje dane bez generowania żadnego kodu -

Krok 1

Przede wszystkim przeczytaj schemat z pliku. Aby to zrobić, użyjSchema.Parserklasa. Ta klasa udostępnia metody do analizowania schematu w różnych formatach.

Utwórz wystąpienie Schema.Parser class, przekazując ścieżkę do pliku, w którym przechowywany jest schemat.

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

Krok 2

Utwórz obiekt GenericRecord interfejs, tworząc wystąpienie GenericData.Recordklasa, jak pokazano poniżej. Przekaż utworzony powyżej obiekt schematu do jego konstruktora.

GenericRecord e1 = new GenericData.Record(schema);

Krok 3

Wstaw wartości w schemacie przy użyciu rozszerzenia put() metoda GenericData klasa.

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

Krok 4

Utwórz obiekt DatumWriter interfejs przy użyciu SpecificDatumWriterklasa. Konwertuje obiekty Java na format serializowany w pamięci. Następujący przykład tworzy wystąpienieSpecificDatumWriter obiekt klasy dla emp klasa -

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

Krok 5

Utwórz instancję DataFileWriter dla empklasa. Ta klasa zapisuje zserializowane rekordy danych zgodnych ze schematem, wraz z samym schematem, w pliku. Ta klasa wymagaDatumWriter obiekt, jako parametr konstruktora.

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

Krok 6

Otwórz nowy plik, aby zapisać dane pasujące do danego schematu za pomocą create()metoda. Ta metoda wymaga schematu i ścieżki do pliku, w którym mają być przechowywane dane, jako parametrów.

W poniższym przykładzie schemat jest przekazywany za pomocą getSchema() metoda, a plik danych jest przechowywany w ścieżce

/home/Hadoop/Avro/serialized_file/emp.avro.

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

Krok 7

Dodaj wszystkie utworzone rekordy do pliku za pomocą append( ) metoda, jak pokazano poniżej.

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

Przykład - serializacja przy użyciu parserów

Poniższy kompletny program pokazuje, jak serializować dane za pomocą parserów -

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”);
   }
}

Przejdź do katalogu, w którym znajduje się wygenerowany kod. W tym przypadku o godzhome/Hadoop/Avro_work/without_code_gen.

$ cd home/Hadoop/Avro_work/without_code_gen/

Teraz skopiuj i zapisz powyższy program w pliku o nazwie Serialize.java. Skompiluj i wykonaj, jak pokazano poniżej -

$ javac Serialize.java
$ java Serialize

Wynik

data successfully serialized

Jeśli zweryfikujesz ścieżkę podaną w programie, możesz znaleźć wygenerowany plik serializowany, jak pokazano poniżej.