Package com.datasalt.pangool.tuplemr.serialization

Source Code of com.datasalt.pangool.tuplemr.serialization.FieldAvroSerialization$AvroFieldDeserializer

package com.datasalt.pangool.tuplemr.serialization;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;

import org.apache.avro.Schema;
import org.apache.avro.io.BinaryDecoder;
import org.apache.avro.io.BinaryEncoder;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.io.DecoderFactory;
import org.apache.avro.io.EncoderFactory;
import org.apache.avro.reflect.ReflectDatumReader;
import org.apache.avro.reflect.ReflectDatumWriter;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.avro.specific.SpecificDatumWriter;

import com.datasalt.pangool.io.Schema.Field.FieldDeserializer;
import com.datasalt.pangool.io.Schema.Field.FieldSerializer;

public class FieldAvroSerialization {
 
  public static class AvroFieldSerializer<T> implements FieldSerializer<T>{

    private DatumWriter<T> writer;
    private OutputStream out;
    private BinaryEncoder encoder;

    @Override
    public void open(OutputStream out) throws IOException {
      this.out = out;
      this.encoder = new EncoderFactory().configureBlockSize(512)
          .binaryEncoder(out, null);
    }

    @Override
    public void serialize(T obj) throws IOException {
      writer.write(obj, encoder);
      // would be a lot faster if the Serializer interface had a flush()
      // method and the Hadoop framework called it when needed rather
      // than for every record.
      encoder.flush();
     
    }
   
    @Override
    public void close() throws IOException {
      out.close();
    }

    @Override
    public void setProps(Map<String, String> properties) {
      Schema schema = Schema.parse(properties.get("avro.schema"));
      String r = properties.get("avro.reflection");
      boolean isReflect = (r != null) && Boolean.parseBoolean(r);
      writer = (isReflect) ?
         new ReflectDatumWriter<T>(schema)
        : new SpecificDatumWriter<T>(schema);
    }
   
  }
 
  public static class AvroFieldDeserializer<T> implements FieldDeserializer<T>{

    private static final DecoderFactory FACTORY = DecoderFactory.get();
    private DatumReader<T> reader;
    private BinaryDecoder decoder;
   
    public AvroFieldDeserializer(){
    }
   
    @Override
    public void close() throws IOException {
      decoder.inputStream().close();
    }

    @Override
    public T deserialize(T obj) throws IOException {
//      if (wrapper == null){
//        wrapper = new AvroWrapper<Object>();
//      }
      obj= reader.read(obj, decoder);
      //wrapper.datum(obj);
      //return wrapper;
      return obj;
    }

    @Override
    public void open(InputStream in) throws IOException {
      this.decoder = FACTORY.directBinaryDecoder(in, decoder);
    }

    @Override
    public void setProps(Map<String, String> properties) {
      Schema schema = Schema.parse(properties.get("avro.schema"));
      String r = properties.get("avro.reflection");
      boolean isReflect = (r != null) && Boolean.parseBoolean(r);
      reader = (isReflect) ? new ReflectDatumReader<T>(schema)
          : new SpecificDatumReader<T>(schema);
    }
   
  }

}
TOP

Related Classes of com.datasalt.pangool.tuplemr.serialization.FieldAvroSerialization$AvroFieldDeserializer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.