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 −

이 클래스는 스키마에 따라 데이터를 생성하는 데 유용합니다.

생성 된 클래스에는-

  • 기본 생성자 및 스키마의 모든 변수를 허용하는 매개 변수화 된 생성자.
  • 스키마의 모든 변수에 대한 setter 및 getter 메서드.
  • 스키마를 반환하는 Get () 메서드.
  • 빌더 방법.

데이터 생성 및 직렬화

먼저이 프로젝트에서 사용 된 생성 된 자바 파일을 현재 디렉토리에 복사하거나 해당 파일이있는 곳에서 가져옵니다.

이제 새 Java 파일을 작성하고 생성 된 파일에서 클래스를 인스턴스화 할 수 있습니다 (emp)을 클릭하여 직원 데이터를 스키마에 추가합니다.

apache Avro를 사용하여 스키마에 따라 데이터를 생성하는 절차를 살펴 보겠습니다.

1 단계

생성 된 인스턴스화 emp 수업.

emp e1=new emp( );

2 단계

setter 메서드를 사용하여 첫 번째 직원의 데이터를 삽입합니다. 예를 들어 Omar라는 직원의 세부 정보를 만들었습니다.

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

마찬가지로 setter 메서드를 사용하여 모든 직원 세부 정보를 입력합니다.

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

프로그램에 주어진 경로를 확인하면 아래와 같이 생성 된 직렬화 파일을 찾을 수 있습니다.