Avro-serialization-by-generating-class

提供:Dev Guides
移動先:案内検索

AVRO-生成クラスによるシリアル化

スキーマに対応するクラスを生成するか、パーサーライブラリを使用して、Avroスキーマをプログラムに読み込むことができます。 この章では、クラスを生成してスキーマを読み取る方法と、Avrを使用してデータを*シリアル化*する方法について説明します。

Avro WithCode Serializing

クラスの生成によるシリアル化

Avroを使用してデータをシリアル化するには、以下の手順に従ってください-

  • Avroスキーマを記述します。
  • Avroユーティリティを使用してスキーマをコンパイルします。 あなたはそれに対応するJavaコードを取得します スキーマ
  • スキーマにデータを入力します。
  • Avroライブラリを使用してシリアル化します。

スキーマの定義

あなたは次の詳細を持つスキーマが必要だと仮定します-

Field Name id age salary address
type String int int int string

以下に示すようにAvroスキーマを作成します。

*emp.avsc* として保存します。
{
   "namespace": "finddevguides.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 は、ツールを含むjarです。

Avroスキーマをコンパイルする構文

java -jar <path/to/avro-tools-1.7.7.jar> compile schema <path/to/schema-file> <destination-folder>

ホームフォルダーでターミナルを開きます。

以下に示すように、Avroで動作する新しいディレクトリを作成します-

$ mkdir Avro_Work

新しく作成されたディレクトリで、3つのサブディレクトリを作成します-

  • 最初に* schema、*という名前を付けて、スキーマを配置します。
  • 生成されたコードを配置するための* with_code_gen、*という名前。
  • 3番目の名前は jars で、jarファイルを配置します。
$ mkdir schema
$ mkdir with_code_gen
$ mkdir jars

次のスクリーンショットは、すべてのディレクトリを作成した後の Avro_work フォルダーの外観を示しています。

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コードです。

たとえば、このインスタンスでは、 finddevguides という名前のパッケージ/フォルダーが作成され、comという名前の別のフォルダーが含まれます(名前空間はfinddevguides.comであるため)、その中に生成されたファイル emp.java を確認できます。 次のスナップショットは emp.java を示しています-

サンプルプログラムのスナップショット

このクラスは、スキーマに従ってデータを作成するのに役立ちます。

生成されたクラスが含まれています-

  • デフォルトのコンストラクター、およびスキーマのすべての変数を受け入れるパラメーター化されたコンストラクター。
  • スキーマ内のすべての変数の設定メソッドと取得メソッド。
  • スキーマを返すGet()メソッド。
  • ビルダーメソッド。

データの作成とシリアル化

まず、このプロジェクトで使用される生成されたJavaファイルを現在のディレクトリにコピーするか、それが置かれている場所からインポートします。

これで、新しいJavaファイルを作成し、生成されたファイル( emp )でクラスをインスタンス化して、従業員データをスキーマに追加できます。

Apache Avroを使用してスキーマに従ってデータを作成する手順を見てみましょう。

ステップ1

生成された emp クラスをインスタンス化します。

emp e1=new emp( );

ステップ2

セッターメソッドを使用して、最初の従業員のデータを挿入します。 たとえば、Omarという名前の従業員の詳細を作成しました。

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

同様に、セッターメソッドを使用してすべての従業員の詳細を入力します。

ステップ3

*SpecificDatumWriter* クラスを使用して、 *DatumWriter* インターフェイスのオブジェクトを作成します。 これにより、Javaオブジェクトがメモリ内のシリアル化された形式に変換されます。 次の例では、 *emp* クラスの *SpecificDatumWriter* クラスオブジェクトをインスタンス化します。
DatumWriter<emp> empDatumWriter = new SpecificDatumWriter<emp>(emp.class);

ステップ4

*emp* クラスの *DataFileWriter* をインスタンス化します。 このクラスは、スキーマに準拠したデータのシーケンスシリアル化されたレコードを、スキーマ自体とともにファイルに書き込みます。 このクラスには、コンストラクターのパラメーターとして *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 にあります。

ターミナル内-

$ cd home/Hadoop/Avro_work/with_code_gen/
  • GUIで-*

生成されたコード

上記のプログラムをコピーして、 Serialize.java という名前のファイルに保存します

次のようにコンパイルして実行します-

$ javac Serialize.java
$ java Serialize

出力

data successfully serialized

プログラムで指定されたパスを確認すると、以下に示すように、生成されたシリアル化されたファイルを見つけることができます。

生成されたシリアル化ファイル