AVRO - Serialization By Generating Class

Người ta có thể đọc một lược đồ Avro vào chương trình bằng cách tạo một lớp tương ứng với một lược đồ hoặc bằng cách sử dụng thư viện phân tích cú pháp. Chương này mô tả cách đọc lược đồby generating a classSerializing dữ liệu sử dụng Avr.

Serialization bằng cách tạo một lớp

Để tuần tự hóa dữ liệu bằng Avro, hãy làm theo các bước như dưới đây -

  • Viết giản đồ Avro.

  • Biên dịch lược đồ bằng tiện ích Avro. Bạn nhận được mã Java tương ứng với lược đồ đó.

  • Điền vào lược đồ với dữ liệu.

  • Tuần tự hóa nó bằng cách sử dụng thư viện Avro.

Xác định một lược đồ

Giả sử bạn muốn một lược đồ với các chi tiết sau:

Field Tên Tôi tuổi tác tiền lương Địa chỉ
type Chuỗi int int int chuỗi

Tạo một lược đồ Avro như hình dưới đây.

Lưu nó thành 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"}
   ]
}

Biên dịch lược đồ

Sau khi tạo một lược đồ Avro, bạn cần biên dịch lược đồ đã tạo bằng các công cụ Avro. avro-tools-1.7.7.jar là hũ đựng các dụng cụ.

Cú pháp để biên dịch một lược đồ Avro

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

Mở thiết bị đầu cuối trong thư mục chính.

Tạo một thư mục mới để làm việc với Avro như hình dưới đây -

$ mkdir Avro_Work

Trong thư mục mới tạo, hãy tạo ba thư mục con -

  • Được đặt tên đầu tiên schema, để đặt lược đồ.

  • Thứ hai được đặt tên with_code_gen, để đặt mã đã tạo.

  • Thứ ba được đặt tên jars, để đặt các tệp jar.

$ mkdir schema
$ mkdir with_code_gen
$ mkdir jars

Ảnh chụp màn hình sau đây cho thấy cách Avro_work thư mục sẽ trông giống như sau khi tạo tất cả các thư mục.

  • Hiện nay /home/Hadoop/Avro_work/jars/avro-tools-1.7.7.jar là đường dẫn cho thư mục mà bạn đã tải xuống tệp avro-tools-1.7.7.jar.

  • /home/Hadoop/Avro_work/schema/ là đường dẫn cho thư mục nơi lưu trữ tệp giản đồ emp.avsc của bạn.

  • /home/Hadoop/Avro_work/with_code_gen là thư mục mà bạn muốn lưu trữ các tệp lớp đã tạo.

Bây giờ, hãy biên dịch lược đồ như được hiển thị bên dưới:

$ 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

Sau khi biên dịch, một gói theo không gian tên của lược đồ được tạo trong thư mục đích. Trong gói này, mã nguồn Java với tên lược đồ được tạo. Mã nguồn được tạo này là mã Java của lược đồ đã cho có thể được sử dụng trực tiếp trong các ứng dụng.

Ví dụ, trong trường hợp này, một gói / thư mục, có tên tutorialspoint được tạo có chứa một thư mục khác có tên com (vì không gian tên là tutorialspoint.com) và bên trong nó, bạn có thể quan sát tệp được tạo emp.java. Ảnh chụp nhanh sau đây cho thấyemp.java -

Lớp này hữu ích để tạo dữ liệu theo lược đồ.

Lớp được tạo chứa -

  • Hàm tạo mặc định và hàm tạo tham số chấp nhận tất cả các biến của lược đồ.
  • Phương thức setter và getter cho tất cả các biến trong lược đồ.
  • Phương thức get () trả về lược đồ.
  • Các phương thức xây dựng.

Tạo và tuần tự hóa dữ liệu

Trước hết, sao chép tệp java đã tạo được sử dụng trong dự án này vào thư mục hiện tại hoặc nhập tệp từ vị trí của tệp.

Bây giờ chúng ta có thể viết một tệp Java mới và khởi tạo lớp trong tệp được tạo (emp) để thêm dữ liệu nhân viên vào lược đồ.

Chúng ta hãy xem quy trình tạo dữ liệu theo lược đồ bằng apache Avro.

Bước 1

Khởi tạo emp lớp học.

emp e1=new emp( );

Bước 2

Sử dụng các phương thức setter, chèn dữ liệu của nhân viên đầu tiên. Ví dụ, chúng tôi đã tạo các chi tiết của nhân viên tên là Omar.

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

Tương tự, hãy điền tất cả thông tin chi tiết của nhân viên bằng các phương pháp setter.

Bước 3

Tạo một đối tượng của DatumWriter giao diện sử dụng SpecificDatumWriterlớp học. Điều này chuyển đổi các đối tượng Java thành định dạng tuần tự trong bộ nhớ. Ví dụ sau khởi tạoSpecificDatumWriter đối tượng lớp cho emp lớp học.

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

Bước 4

Khởi tạo DataFileWriter cho emplớp học. Lớp này ghi một chuỗi các bản ghi dữ liệu được tuần tự hóa theo một lược đồ, cùng với chính lược đồ đó, trong một tệp. Lớp này yêu cầuDatumWriter đối tượng, như một tham số cho hàm tạo.

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

Bước 5

Mở một tệp mới để lưu trữ dữ liệu khớp với lược đồ đã cho bằng cách sử dụng create()phương pháp. Phương thức này yêu cầu lược đồ và đường dẫn của tệp nơi lưu trữ dữ liệu, dưới dạng các tham số.

Trong ví dụ sau, lược đồ được chuyển bằng cách sử dụng getSchema() và tệp dữ liệu được lưu trữ trong đường dẫn - /home/Hadoop/Avro/serialized_file/emp.avro.

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

Bước 6

Thêm tất cả các bản ghi đã tạo vào tệp bằng cách sử dụng append() như hình dưới đây -

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

Ví dụ - Tuần tự hóa bằng cách tạo một lớp

Chương trình hoàn chỉnh sau đây cho thấy cách tuần tự hóa dữ liệu thành một tệp bằng 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");
   }
}

Duyệt qua thư mục nơi mã đã tạo được đặt. Trong trường hợp này, tạihome/Hadoop/Avro_work/with_code_gen.

In Terminal −

$ cd home/Hadoop/Avro_work/with_code_gen/

In GUI −

Bây giờ sao chép và lưu chương trình trên trong tệp có tên Serialize.java

Biên dịch và thực thi nó như hình dưới đây -

$ javac Serialize.java
$ java Serialize

Đầu ra

data successfully serialized

Nếu bạn xác minh đường dẫn được cung cấp trong chương trình, bạn có thể tìm thấy tệp được tuần tự hóa được tạo như hình dưới đây.