AVRO - сериализация путем создания класса
Можно прочитать схему Avro в программе либо путем создания класса, соответствующего схеме, либо с помощью библиотеки синтаксических анализаторов. В этой главе описывается, как читать схемуby generating a class и Serializing данные с использованием Avr.
Сериализация путем создания класса
Чтобы сериализовать данные с помощью Avro, выполните следующие действия:
Напишите схему Avro.
Скомпилируйте схему с помощью утилиты Avro. Вы получаете код Java, соответствующий этой схеме.
Заполните схему данными.
Сериализуйте его с помощью библиотеки Avro.
Определение схемы
Предположим, вам нужна схема со следующими деталями -
Field | имя | Я бы | возраст | зарплата | адрес |
type | Строка | int | int | int | строка |
Создайте схему Avro, как показано ниже.
Сохранить как 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"}
]
}
Компиляция схемы
После создания схемы Avro вам необходимо скомпилировать созданную схему с помощью инструментов Avro. avro-tools-1.7.7.jar это банка с инструментами.
Синтаксис для компиляции схемы Avro
java -jar <path/to/avro-tools-1.7.7.jar> compile schema <path/to/schema-file> <destination-folder>
Откройте терминал в домашней папке.
Создайте новый каталог для работы с Avro, как показано ниже -
$ mkdir Avro_Work
Во вновь созданном каталоге создайте три подкаталога -
Первый названный schema, разместить схему.
Второй по имени with_code_gen, разместить сгенерированный код.
Третье имя jars, разместить файлы jar.
$ mkdir schema
$ mkdir with_code_gen
$ mkdir jars
На следующем снимке экрана показано, как Avro_work папка должна выглядеть после создания всех каталогов.
В настоящее время /home/Hadoop/Avro_work/jars/avro-tools-1.7.7.jar - это путь к каталогу, в который вы скачали файл avro-tools-1.7.7.jar.
/home/Hadoop/Avro_work/schema/ - это путь к каталогу, в котором хранится ваш файл схемы emp.avsc.
/home/Hadoop/Avro_work/with_code_gen - это каталог, в котором вы хотите хранить сгенерированные файлы классов.
Теперь скомпилируйте схему, как показано ниже -
$ 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
После компиляции в целевом каталоге создается пакет в соответствии с пространством имен схемы. В этом пакете создается исходный код Java с именем схемы. Этот сгенерированный исходный код представляет собой код Java данной схемы, который можно напрямую использовать в приложениях.
Например, в этом случае пакет / папка с именем tutorialspoint создается, который содержит другую папку с именем com (поскольку пространство имен - tutorialspoint.com), и внутри нее вы можете наблюдать сгенерированный файл emp.java. Следующий снимок показываетemp.java -
Этот класс полезен для создания данных по схеме.
Сгенерированный класс содержит -
- Конструктор по умолчанию и параметризованный конструктор, который принимает все переменные схемы.
- Методы установки и получения для всех переменных в схеме.
- Get (), который возвращает схему.
- Строительные методы.
Создание и сериализация данных
Прежде всего, скопируйте сгенерированный файл java, используемый в этом проекте, в текущий каталог или импортируйте его из того места, где он находится.
Теперь мы можем написать новый файл Java и создать экземпляр класса в сгенерированном файле (emp), чтобы добавить данные о сотрудниках в схему.
Давайте посмотрим, как создать данные по схеме с помощью apache Avro.
Шаг 1
Создайте экземпляр сгенерированного emp класс.
emp e1=new emp( );
Шаг 2
Используя методы установки, вставьте данные первого сотрудника. Например, мы создали данные сотрудника по имени Омар.
e1.setName("omar");
e1.setAge(21);
e1.setSalary(30000);
e1.setAddress("Hyderabad");
e1.setId(001);
Аналогичным образом заполните все данные о сотрудниках, используя методы установки.
Шаг 3
Создать объект DatumWriter интерфейс с использованием SpecificDatumWriterкласс. Это преобразует объекты Java в сериализованный формат в памяти. В следующем примере создаетсяSpecificDatumWriter объект класса для emp класс.
DatumWriter<emp> empDatumWriter = new SpecificDatumWriter<emp>(emp.class);
Шаг 4
Создать экземпляр DataFileWriter за empкласс. Этот класс записывает последовательность сериализованных записей данных, соответствующих схеме, вместе с самой схемой в файл. Этот класс требуетDatumWriter объект в качестве параметра конструктора.
DataFileWriter<emp> empFileWriter = new DataFileWriter<emp>(empDatumWriter);
Шаг 5
Откройте новый файл для хранения данных, соответствующих заданной схеме, используя create()метод. Этот метод требует схемы и пути к файлу, в котором должны храниться данные, в качестве параметров.
В следующем примере схема передается с использованием getSchema() метод, а файл данных сохраняется по пути - /home/Hadoop/Avro/serialized_file/emp.avro.
empFileWriter.create(e1.getSchema(),new File("/home/Hadoop/Avro/serialized_file/emp.avro"));
Шаг 6
Добавьте все созданные записи в файл, используя append() метод, как показано ниже -
empFileWriter.append(e1);
empFileWriter.append(e2);
empFileWriter.append(e3);
Пример - сериализация путем создания класса
Следующая полная программа показывает, как сериализовать данные в файл с помощью 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");
}
}
Просмотрите каталог, в котором размещен сгенерированный код. В этом случае приhome/Hadoop/Avro_work/with_code_gen.
In Terminal −
$ cd home/Hadoop/Avro_work/with_code_gen/
In GUI −
Теперь скопируйте и сохраните указанную выше программу в файле с именем Serialize.java
Скомпилируйте и выполните его, как показано ниже -
$ javac Serialize.java
$ java Serialize
Вывод
data successfully serialized
Если вы проверите путь, указанный в программе, вы сможете найти сгенерированный сериализованный файл, как показано ниже.