AVRO-클래스 생성을 통한 직렬화

스키마에 해당하는 클래스를 생성하거나 파서 라이브러리를 사용하여 Avro 스키마를 프로그램으로 읽을 수 있습니다. 이 장에서는 스키마를 읽는 방법에 대해 설명합니다.by generating a classSerializing 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

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