Учебники

AVRO — Сериализация с использованием парсеров

Можно прочитать схему Avro в программу, создав класс, соответствующий схеме, или используя библиотеку синтаксических анализаторов. В Avro данные всегда хранятся с соответствующей схемой. Поэтому мы всегда можем прочитать схему без генерации кода.

В этой главе описывается, как прочитать схему с помощью библиотеки синтаксических анализаторов и сериализовать данные с помощью Avro.

Авро без кода сериализации

Сериализация с использованием библиотеки парсеров

Чтобы сериализовать данные, нам нужно прочитать схему, создать данные в соответствии со схемой и сериализовать схему с помощью API Avro. Следующая процедура сериализует данные без генерации кода —

Шаг 1

Прежде всего, прочитайте схему из файла. Для этого используйте класс Schema.Parser . Этот класс предоставляет методы для анализа схемы в разных форматах.

Создайте экземпляр класса Schema.Parser , передав путь к файлу, в котором хранится схема.

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

Шаг 2

Создайте объект интерфейса GenericRecord , создав экземпляр класса GenericData.Record, как показано ниже. Передайте созданный выше объект схемы его конструктору.

GenericRecord e1 = new GenericData.Record(schema);

Шаг 3

Вставьте значения в схему, используя метод put () класса GenericData .

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

Шаг 4

Создайте объект интерфейса DatumWriter, используя класс SpecificDatumWriter . Он преобразует объекты Java в сериализованный формат в памяти. В следующем примере создается экземпляр объекта класса SpecificDatumWriter для класса emp

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

Шаг 5

Создание экземпляра DataFileWriter для класса emp . Этот класс записывает в файл сериализованные записи данных, соответствующих схеме, вместе с самой схемой. Этот класс требует объекта DatumWriter в качестве параметра для конструктора.

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

Шаг 6

Откройте новый файл, чтобы сохранить данные, соответствующие данной схеме, используя метод create () . Этот метод требует схему и путь к файлу, в котором должны храниться данные, в качестве параметров.

В приведенном ниже примере схема передается с использованием метода getSchema (), а файл данных сохраняется в пути

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

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

Шаг 7

Добавьте все созданные записи в файл, используя метод append (), как показано ниже.

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

Пример — Сериализация с использованием парсеров

Следующая полная программа показывает, как сериализовать данные с использованием анализаторов:

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

Перейдите в каталог, где находится сгенерированный код. В этом случае дома / Hadoop / Avro_work / без_кода_ген .

$ cd home/Hadoop/Avro_work/without_code_gen/

Без кода Gen

Теперь скопируйте и сохраните вышеуказанную программу в файл с именем Serialize.java . Скомпилируйте и выполните его, как показано ниже —

$ javac Serialize.java
$ java Serialize

Выход

data successfully serialized

Если вы проверите путь, указанный в программе, вы можете найти сгенерированный сериализованный файл, как показано ниже.