瀏覽代碼

HADOOP-3061. Writable types for doubles and bytes. Contributed by Andrzej
Bialecki.


git-svn-id: https://svn.apache.org/repos/asf/hadoop/core/trunk@651052 13f79535-47bb-0310-9956-ffa450edef68

Owen O'Malley 17 年之前
父節點
當前提交
acec6b4345

+ 3 - 0
CHANGES.txt

@@ -20,6 +20,9 @@ Trunk (unreleased changes)
     HADOOP-2585. Name-node imports namespace data from a recent checkpoint
     accessible via a NFS mount. (shv)
 
+    HADOOP-3061. Writable types for doubles and bytes. (Andrzej
+    Bialecki via omalley)
+
   IMPROVEMENTS
    
     HADOOP-2928. Remove deprecated FileSystem.getContentLength().

+ 87 - 0
src/java/org/apache/hadoop/io/ByteWritable.java

@@ -0,0 +1,87 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.io;
+
+import java.io.*;
+
+/** A WritableComparable for a single byte. */
+public class ByteWritable implements WritableComparable {
+  private byte value;
+
+  public ByteWritable() {}
+
+  public ByteWritable(byte value) { set(value); }
+
+  /** Set the value of this ByteWritable. */
+  public void set(byte value) { this.value = value; }
+
+  /** Return the value of this ByteWritable. */
+  public byte get() { return value; }
+
+  public void readFields(DataInput in) throws IOException {
+    value = in.readByte();
+  }
+
+  public void write(DataOutput out) throws IOException {
+    out.writeByte(value);
+  }
+
+  /** Returns true iff <code>o</code> is a ByteWritable with the same value. */
+  public boolean equals(Object o) {
+    if (!(o instanceof ByteWritable)) {
+      return false;
+    }
+    ByteWritable other = (ByteWritable)o;
+    return this.value == other.value;
+  }
+
+  public int hashCode() {
+    return (int)value;
+  }
+
+  /** Compares two ByteWritables. */
+  public int compareTo(Object o) {
+    int thisValue = this.value;
+    int thatValue = ((ByteWritable)o).value;
+    return (thisValue < thatValue ? -1 : (thisValue == thatValue ? 0 : 1));
+  }
+
+  public String toString() {
+    return Byte.toString(value);
+  }
+
+  /** A Comparator optimized for ByteWritable. */ 
+  public static class Comparator extends WritableComparator {
+    public Comparator() {
+      super(ByteWritable.class);
+    }
+
+    public int compare(byte[] b1, int s1, int l1,
+                       byte[] b2, int s2, int l2) {
+      byte thisValue = b1[s1];
+      byte thatValue = b2[s2];
+      return (thisValue < thatValue ? -1 : (thisValue == thatValue ? 0 : 1));
+    }
+  }
+
+  static {                                        // register this comparator
+    WritableComparator.define(ByteWritable.class, new Comparator());
+  }
+}
+

+ 95 - 0
src/java/org/apache/hadoop/io/DoubleWritable.java

@@ -0,0 +1,95 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.io;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+/**
+ * Writable for Double values.
+ */
+public class DoubleWritable implements WritableComparable {
+
+  private double value = 0.0;
+  
+  public DoubleWritable() {
+    
+  }
+  
+  public DoubleWritable(double value) {
+    set(value);
+  }
+  
+  public void readFields(DataInput in) throws IOException {
+    value = in.readDouble();
+  }
+
+  public void write(DataOutput out) throws IOException {
+    out.writeDouble(value);
+  }
+  
+  public void set(double value) { this.value = value; }
+  
+  public double get() { return value; }
+
+  /**
+   * Returns true iff <code>o</code> is a DoubleWritable with the same value.
+   */
+  public boolean equals(Object o) {
+    if (!(o instanceof DoubleWritable)) {
+      return false;
+    }
+    DoubleWritable other = (DoubleWritable)o;
+    return this.value == other.value;
+  }
+  
+  public int hashCode() {
+    return (int)Double.doubleToLongBits(value);
+  }
+  
+  public int compareTo(Object o) {
+    DoubleWritable other = (DoubleWritable)o;
+    return (value < other.value ? -1 : (value == other.value ? 0 : 1));
+  }
+  
+  public String toString() {
+    return Double.toString(value);
+  }
+
+  /** A Comparator optimized for DoubleWritable. */ 
+  public static class Comparator extends WritableComparator {
+    public Comparator() {
+      super(DoubleWritable.class);
+    }
+
+    public int compare(byte[] b1, int s1, int l1,
+                       byte[] b2, int s2, int l2) {
+      double thisValue = readDouble(b1, s1);
+      double thatValue = readDouble(b2, s2);
+      return (thisValue < thatValue ? -1 : (thisValue == thatValue ? 0 : 1));
+    }
+  }
+
+  static {                                        // register this comparator
+    WritableComparator.define(DoubleWritable.class, new Comparator());
+  }
+
+}
+

+ 8 - 0
src/test/org/apache/hadoop/io/TestWritable.java

@@ -64,6 +64,14 @@ public class TestWritable extends TestCase {
   public void testSimpleWritable() throws Exception {
     testWritable(new SimpleWritable());
   }
+  
+  public void testByteWritable() throws Exception {
+    testWritable(new ByteWritable((byte)128));
+  }
+
+  public void testDoubleWritable() throws Exception {
+    testWritable(new DoubleWritable(1.0));
+  }
 
   /** Utility method for testing writables. */
   public static Writable testWritable(Writable before)