Можно прочитать схему 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/
Теперь скопируйте и сохраните вышеуказанную программу в файл с именем Serialize.java . Скомпилируйте и выполните его, как показано ниже —
$ javac Serialize.java $ java Serialize
Выход
data successfully serialized
Если вы проверите путь, указанный в программе, вы можете найти сгенерированный сериализованный файл, как показано ниже.