avroシーケンス化について

5120 ワード

Avroは、2つのシーケンス化方法を提供します.
      avro-specific:
thriftと同様にidl方式でコードを生成し、コマンドを生成することができます.
java -jar avro-tools-1.7.4.jar compile schema data.avsc src/

      avro-generic:
schemaのダイナミックロードをサポートし、再コンパイルを必要とせずに新しいデータソースを処理できます.
 
AVroのデータ型:
基本タイプ:
      null:                     no value
      boolean:              a binary value
      int:                       32-bit signed integer
      long:                    64-bit signed integer
      float:                    single precision (32-bit) IEEE 754 floating-point number
      double:                double precision (64-bit) IEEE 754 floating-point number
      bytes:                  sequence of 8-bit unsigned bytes
      string:                  unicode character sequence
 
複雑なタイプ:
avroは6種類の複雑なタイプをサポートします:records,enums,arrays,maps,unionsm,fixed
 
次はrecordsとして定義された例です.
       {
「type」:「record」//recordタイプを指定します(required)
「name」:「AvroData」//生成されたクラス名、(required)
        "namespace": "com.wuwen.",//コマンドスペース、(optional)
        "doc": "avro scheama test.",//schemaを記述するための、(optional)
「aliases」:["avroaliases"],//nameの別名、(optional)
「fields」:[//フィールド名、(required)
{「name」:「GUID」,「type」:「string」},//GUIDというフィールド名を定義し、基本データ型がstringのフィールド
               {"name": "Content", "type": "string"},
               {"name": "Time", "type": "long"}
        ]
        }
 
例:
package com.wuwen;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

import org.apache.avro.Schema;
import org.apache.avro.file.DataFileReader;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.file.FileReader;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericDatumReader;
import org.apache.avro.generic.GenericDatumWriter;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.io.BinaryDecoder;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.io.DecoderFactory;
import org.apache.avro.io.Encoder;
import org.apache.avro.io.EncoderFactory;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.avro.specific.SpecificDatumWriter;
import org.apache.avro.util.Utf8;

public class AvroDemo {

	public void serializeGeneric() throws IOException {
		Schema schema = Schema.parse(new File("E:/avro/AvroData.avsc"));
		GenericRecord datum = new GenericData.Record(schema);
		datum.put("GUID", new Utf8("1234567"));
		datum.put("Content", new Utf8("Avro  "));
		datum.put("Time", 20130305134700L);

		// Serialize it.
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		DatumWriter<GenericRecord> writer = new GenericDatumWriter<GenericRecord>(schema);
		Encoder encoder = EncoderFactory.get().binaryEncoder(out, null);
		writer.write(datum, encoder);
		encoder.flush();
		out.close();

		// Deserialize it.
		DatumReader<GenericRecord> reader = new GenericDatumReader<GenericRecord>(schema);
		BinaryDecoder decoder = DecoderFactory.get().binaryDecoder(out.toByteArray(), null);
		GenericRecord result = reader.read(null, decoder);
		System.out.printf("GUID: %s, Content: %s, Time: %s
", result.get("GUID"), result.get("Content"), result.get("Time")); } public void serializeSpecific() throws IOException { AvroData datum = new AvroData(); datum.setGUID(new Utf8("1234567")); datum.setContent(new Utf8("1234567")); datum.setTime(20130305134700L); File tmpFile = new File("E:/avro/myAvroExample.avro"); // Serialize it. DataFileWriter<AvroData> writer = new DataFileWriter<AvroData>(new SpecificDatumWriter<AvroData>(AvroData.class)); writer.create(AvroData.SCHEMA$, tmpFile); writer.append(datum); writer.close(); // Deserialize it. FileReader<AvroData> reader = DataFileReader.openReader(tmpFile, new SpecificDatumReader<AvroData>(AvroData.class)); while (reader.hasNext()) { AvroData result = reader.next(); System.out.printf("GUID: %s, Content: %s, Time: %s
", result.getGUID(), result.getContent(), result.getTime()); } reader.close(); } public static void main(String[] args) throws IOException { AvroDemo example = new AvroDemo(); System.out.println("Generic"); example.serializeGeneric(); System.out.println("Specific"); example.serializeSpecific(); } }