avroシーケンス化について
5120 ワード
Avroは、2つのシーケンス化方法を提供します.
avro-specific:
thriftと同様にidl方式でコードを生成し、コマンドを生成することができます.
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"}
]
}
例:
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();
}
}