Avro-serialization-using-parsers

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

AVRO-パーサーを使用したシリアル化

スキーマに対応するクラスを生成するか、パーサーライブラリを使用して、Avroスキーマをプログラムに読み込むことができます。 Avroでは、データは常に対応するスキーマとともに保存されます。 したがって、コードを生成せずにスキーマをいつでも読み取ることができます。

この章では、パーサーライブラリを使用してスキーマを読み取る方法、およびAvroを使用してデータを*シリアル化する方法について説明します。

コードシリアル化なしのAvro

パーサーライブラリを使用したシリアル化

データをシリアル化するには、スキーマを読み取り、スキーマに従ってデータを作成し、Avro APIを使用してスキーマをシリアル化する必要があります。 次の手順は、コードを生成せずにデータをシリアル化します-

ステップ1

まず、ファイルからスキーマを読み取ります。 これを行うには、 Schema.Parser クラスを使用します。 このクラスは、さまざまな形式でスキーマを解析するメソッドを提供します。

スキーマが保存されているファイルパスを渡すことにより、 Schema.Parser クラスをインスタンス化します。

Schema schema = new Schema.Parser().parse(new File("/path/to/emp.avsc"));

ステップ2

以下に示すように、 GenericData.Record クラスをインスタンス化して、 GenericRecord インターフェイスのオブジェクトを作成します。 上記の作成されたスキーマオブジェクトをコンストラクタに渡します。

GenericRecord e1 = new GenericData.Record(schema);

ステップ3

*GenericData* クラスの* put()*メソッドを使用して、スキーマに値を挿入します。
e1.put("name", "ramu");
e1.put("id", 001);
e1.put("salary",30000);
e1.put("age", 25);
e1.put("address", "chennai");

ステップ4

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

ステップ5

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

生成されたコードが配置されているディレクトリを参照します。 この場合、 home/Hadoop/Avro_work/without_code_gen にあります。

$ cd home/Hadoop/Avro_work/without_code_gen/

コード生成なし

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

$ javac Serialize.java
$ java Serialize

出力

data successfully serialized

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

コードGen1なし