(5-2) Writable 소스 분석

//Writable은 두 가지 메서드 write()와 ReadFields()가 있는 인터페이스입니다.원본 코드에서 사용자 정의 서열화된 예 코드를 보여 줍니다.
package org.apache.hadoop.io;
/**
 * <p>Example:</p>
 * <p><blockquote><pre>
 *     public class MyWritable implements Writable {
 *       // Some data     
 *       private int counter;
 *       private long timestamp;
 *       
 *       public void write(DataOutput out) throws IOException {
 *         out.writeInt(counter);
 *         out.writeLong(timestamp);
 *       }
 *       
 *       public void readFields(DataInput in) throws IOException {
 *         counter = in.readInt();
 *         timestamp = in.readLong();
 *       }
 *       
 *       public static MyWritable read(DataInput in) throws IOException {
 *         MyWritable w = new MyWritable();
 *         w.readFields(in);
 *         return w;
 *       }
 *     }
 * </pre></blockquote></p>
 */
@InterfaceAudience.Public
@InterfaceStability.Stable
public interface Writable {
  void write(DataOutput out) throws IOException;
  void readFields(DataInput in) throws IOException;
}

//hadoop 서열화는 자바의 이 인터페이스도 사용했다
package java.lang;
import java.util.*;


public interface Comparable<T> {
    public int compareTo(T o);
}

//키의 경우 데이터 정렬의 키이기 때문에 두 개의 키 대상을 비교하는 키도 제공해야 한다. 키의 대응 클래스는 Writable Comparable 인터페이스를 실현해야 한다.
//소스 코드에서도 사용자 정의 Writable Comparable의 인스턴스를 제공합니다.
package org.apache.hadoop.io
 * <p>Example:</p>
 * <p><blockquote><pre>
 *     public class MyWritableComparable implements WritableComparable<MyWritableComparable> {
 *       // Some data
 *       private int counter;
 *       private long timestamp;
 *       
 *       public void write(DataOutput out) throws IOException {
 *         out.writeInt(counter);
 *         out.writeLong(timestamp);
 *       }
 *       
 *       public void readFields(DataInput in) throws IOException {
 *         counter = in.readInt();
 *         timestamp = in.readLong();
 *       }
 *       
 *       public int compareTo(MyWritableComparable o) {
 *         int thisValue = this.value;
 *         int thatValue = o.value;
 *         return (thisValue < thatValue ? -1 : (thisValue==thatValue ? 0 : 1));
 *       }
 *
 *       public int hashCode() {
 *         final int prime = 31;
 *         int result = 1;
 *         result = prime * result + counter;
 *         result = prime * result + (int) (timestamp ^ (timestamp >>> 32));
 *         return result
 *       }
 *     }
 * </pre></blockquote></p>
 */
@InterfaceAudience.Public
@InterfaceStability.Stable
public interface WritableComparable<T> extends Writable, Comparable<T> {
}

//Hadoop이 봉인된 데이터 형식인 LongWritable을 마음대로 보십시오. 이 종류는 Writable Cpmparable 인터페이스를 실현합니다.
//Writable의 write()와 ReadFields() 방법과 Comparable의 compareTo() 방법이 구체적으로 구현됐다.
package org.apache.hadoop.io;
/** A WritableComparable for longs. */
@InterfaceAudience.Public
@InterfaceStability.Stable
public class LongWritable implements WritableComparable<LongWritable> {
  private long value;


  public LongWritable() {}


  public LongWritable(long value) { set(value); }


  /** Set the value of this LongWritable. */
  public void set(long value) { this.value = value; }


  /** Return the value of this LongWritable. */
  public long get() { return value; }


  @Override
  public void readFields(DataInput in) throws IOException {
    value = in.readLong();
  }


  @Override
  public void write(DataOutput out) throws IOException {
    out.writeLong(value);
  }
   /** Compares two LongWritables. */
  @Override
  public int compareTo(LongWritable o) {
    long thisValue = this.value;
    long thatValue = o.value;
    return (thisValue<thatValue ? -1 : (thisValue==thatValue ? 0 : 1));
  }
}

좋은 웹페이지 즐겨찾기