AVRO - Serializacja przez generowanie klasy

Schemat Avro można wczytać do programu generując klasę odpowiadającą schematowi lub korzystając z biblioteki parserów. W tym rozdziale opisano, jak czytać schematby generating a class i Serializing dane za pomocą Avr.

Serializacja przez generowanie klasy

Aby serializować dane za pomocą Avro, wykonaj kroki podane poniżej -

  • Napisz schemat Avro.

  • Skompiluj schemat za pomocą narzędzia Avro. Otrzymasz kod Java odpowiadający temu schematowi.

  • Wypełnij schemat danymi.

  • Serializuj go przy użyciu biblioteki Avro.

Definiowanie schematu

Załóżmy, że potrzebujesz schematu z następującymi szczegółami -

Field Nazwa ID wiek wynagrodzenie adres
type Strunowy int int int strunowy

Utwórz schemat Avro, jak pokazano poniżej.

Zapisz to jako 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"}
   ]
}

Kompilowanie schematu

Po utworzeniu schematu Avro należy skompilować utworzony schemat za pomocą narzędzi Avro. avro-tools-1.7.7.jar to słoik zawierający narzędzia.

Składnia do kompilowania schematu Avro

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

Otwórz terminal w folderze domowym.

Utwórz nowy katalog do pracy z Avro, jak pokazano poniżej -

$ mkdir Avro_Work

W nowo utworzonym katalogu utwórz trzy podkatalogi -

  • Pierwsza nazwa schema, aby umieścić schemat.

  • Drugi nazwany with_code_gen, aby umieścić wygenerowany kod.

  • Trzeci nazwany jars, aby umieścić pliki jar.

$ mkdir schema
$ mkdir with_code_gen
$ mkdir jars

Poniższy zrzut ekranu pokazuje, jak twój Avro_work folder powinien wyglądać jak po utworzeniu wszystkich katalogów.

  • Teraz /home/Hadoop/Avro_work/jars/avro-tools-1.7.7.jar jest ścieżką do katalogu, do którego został pobrany plik avro-tools-1.7.7.jar.

  • /home/Hadoop/Avro_work/schema/ jest ścieżką do katalogu, w którym przechowywany jest plik schematu emp.avsc.

  • /home/Hadoop/Avro_work/with_code_gen jest katalogiem, w którym mają być przechowywane wygenerowane pliki klas.

Teraz skompiluj schemat, jak pokazano poniżej -

$ 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

Po skompilowaniu w katalogu docelowym tworzony jest pakiet zgodnie z przestrzenią nazw schematu. W ramach tego pakietu tworzony jest kod źródłowy Java z nazwą schematu. Ten wygenerowany kod źródłowy jest kodem Java danego schematu, który można bezpośrednio wykorzystać w aplikacjach.

Na przykład w tym przypadku pakiet / folder o nazwie tutorialspoint jest tworzony, który zawiera inny folder o nazwie com (ponieważ przestrzeń nazw to tutorialspoint.com) iw nim możesz obserwować wygenerowany plik emp.java. Poniższa migawka przedstawiaemp.java -

Ta klasa jest przydatna do tworzenia danych według schematu.

Wygenerowana klasa zawiera -

  • Konstruktor domyślny i konstruktor sparametryzowany, który akceptuje wszystkie zmienne schematu.
  • Metody ustawiające i pobierające dla wszystkich zmiennych w schemacie.
  • Get (), która zwraca schemat.
  • Metody konstruktora.

Tworzenie i serializacja danych

Przede wszystkim skopiuj wygenerowany plik java używany w tym projekcie do bieżącego katalogu lub zaimportuj go z miejsca, w którym się znajduje.

Teraz możemy napisać nowy plik Java i utworzyć instancję klasy w wygenerowanym pliku (emp), aby dodać dane pracowników do schematu.

Zobaczmy procedurę tworzenia danych zgodnie ze schematem przy użyciu apache Avro.

Krok 1

Utwórz wystąpienie wygenerowanego pliku emp klasa.

emp e1=new emp( );

Krok 2

Korzystając z metod ustawiających, wprowadź dane pierwszego pracownika. Na przykład stworzyliśmy dane pracownika o imieniu Omar.

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

Podobnie wypełnij wszystkie dane pracownika, korzystając z metod ustawiających.

Krok 3

Utwórz obiekt DatumWriter interfejs przy użyciu SpecificDatumWriterklasa. To 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 4

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

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

Krok 5

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 przy użyciu 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 6

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 przez generowanie klasy

Poniższy kompletny program pokazuje, jak serializować dane do pliku za pomocą 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");
   }
}

Przeglądaj katalog, w którym znajduje się wygenerowany kod. W tym przypadku o godzhome/Hadoop/Avro_work/with_code_gen.

In Terminal −

$ cd home/Hadoop/Avro_work/with_code_gen/

In GUI −

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.