Avro-serialization-using-parsers
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
プログラムで指定されたパスを確認すると、以下に示すように、生成されたシリアル化されたファイルを見つけることができます。