AVRO - Serialization Sử dụng Trình phân tích cú pháp
Người ta có thể đọc một lược đồ Avro vào một 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. Trong Avro, dữ liệu luôn được lưu trữ với lược đồ tương ứng của nó. Do đó, chúng ta luôn có thể đọc một lược đồ mà không cần tạo mã.
Chương này mô tả cách đọc lược đồ by using parsers library và để serialize dữ liệu sử dụng Avro.
Serialization sử dụng thư viện phân tích cú pháp
Để tuần tự hóa dữ liệu, chúng ta cần đọc lược đồ, tạo dữ liệu theo lược đồ và tuần tự hóa lược đồ bằng cách sử dụng API Avro. Quy trình sau đây tuần tự hóa dữ liệu mà không tạo ra bất kỳ mã nào -
Bước 1
Trước hết, hãy đọc lược đồ từ tệp. Để làm như vậy, hãy sử dụngSchema.Parserlớp học. Lớp này cung cấp các phương thức để phân tích cú pháp lược đồ theo các định dạng khác nhau.
Khởi tạo Schema.Parser lớp bằng cách chuyển đường dẫn tệp nơi lược đồ được lưu trữ.
Schema schema = new Schema.Parser().parse(new File("/path/to/emp.avsc"));
Bước 2
Tạo đối tượng của GenericRecord giao diện, bằng cách khởi tạo GenericData.Recordlớp như hình bên dưới. Truyền đối tượng lược đồ đã tạo ở trên tới phương thức khởi tạo của nó.
GenericRecord e1 = new GenericData.Record(schema);
Bước 3
Chèn các giá trị vào giản đồ bằng cách sử dụng put() phương pháp của GenericData lớp học.
e1.put("name", "ramu");
e1.put("id", 001);
e1.put("salary",30000);
e1.put("age", 25);
e1.put("address", "chennai");
Bước 4
Tạo một đối tượng của DatumWriter giao diện sử dụng SpecificDatumWriterlớp học. Nó chuyển đổi các đối tượng Java thành định dạng tuần tự hóa 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 5
Khởi tạo DataFileWriter cho emplớp học. Lớp này ghi các bản ghi dữ liệu được tuần tự hóa theo một lược đồ, cùng với bản thân 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> dataFileWriter = new DataFileWriter<emp>(empDatumWriter);
Bước 6
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ụ dưới đây, lược đồ được chuyển bằng cách sử dụng getSchema() phương pháp 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 7
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ụ - Serialization sử dụng Parsers
Chương trình hoàn chỉnh sau đây cho thấy cách tuần tự hóa dữ liệu bằng trình phân tích cú pháp:
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”);
}
}
Duyệt vào thư mục nơi mã đã tạo được đặt. Trong trường hợp này, tạihome/Hadoop/Avro_work/without_code_gen.
$ cd home/Hadoop/Avro_work/without_code_gen/
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.