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.