generic tuple api change, quantiles null from empty sketch
diff --git a/pom.xml b/pom.xml
index 33fdbee..77a5734 100644
--- a/pom.xml
+++ b/pom.xml
@@ -152,7 +152,7 @@
     <dependency>
       <groupId>com.yahoo.datasketches</groupId>
       <artifactId>sketches-core</artifactId>
-      <version>0.10.3</version>
+      <version>0.11.0</version>
     </dependency>
 
     <!-- Hive Dependencies (provided scope) -->
diff --git a/src/main/java/com/yahoo/sketches/hive/quantiles/GetPmfFromDoublesSketchUDF.java b/src/main/java/com/yahoo/sketches/hive/quantiles/GetPmfFromDoublesSketchUDF.java
index 6ab0104..937aaa6 100644
--- a/src/main/java/com/yahoo/sketches/hive/quantiles/GetPmfFromDoublesSketchUDF.java
+++ b/src/main/java/com/yahoo/sketches/hive/quantiles/GetPmfFromDoublesSketchUDF.java
@@ -36,7 +36,9 @@
   public List<Double> evaluate(final BytesWritable serializedSketch, final Double... splitPoints) {
     if (serializedSketch == null) { return null; }
     final DoublesSketch sketch = DoublesSketch.wrap(Memory.wrap(serializedSketch.getBytes()));
-    return Util.primitivesToList(sketch.getPMF(Util.objectsToPrimitives(splitPoints)));
+    final double[] pmf = sketch.getPMF(Util.objectsToPrimitives(splitPoints));
+    if (pmf == null) { return null; }
+    return Util.primitivesToList(pmf);
   }
 
 }
diff --git a/src/main/java/com/yahoo/sketches/hive/quantiles/GetPmfFromStringsSketchUDF.java b/src/main/java/com/yahoo/sketches/hive/quantiles/GetPmfFromStringsSketchUDF.java
index 6b1571b..d8e4793 100644
--- a/src/main/java/com/yahoo/sketches/hive/quantiles/GetPmfFromStringsSketchUDF.java
+++ b/src/main/java/com/yahoo/sketches/hive/quantiles/GetPmfFromStringsSketchUDF.java
@@ -42,7 +42,9 @@
       Comparator.naturalOrder(),
       new ArrayOfStringsSerDe()
     );
-    return Util.primitivesToList(sketch.getPMF(splitPoints));
+    final double[] pmf = sketch.getPMF(splitPoints);
+    if (pmf == null) { return null; }
+    return Util.primitivesToList(pmf);
   }
 
 }
diff --git a/src/main/java/com/yahoo/sketches/hive/quantiles/GetQuantilesFromDoublesSketchUDF.java b/src/main/java/com/yahoo/sketches/hive/quantiles/GetQuantilesFromDoublesSketchUDF.java
index d6f8d2f..68b43dd 100644
--- a/src/main/java/com/yahoo/sketches/hive/quantiles/GetQuantilesFromDoublesSketchUDF.java
+++ b/src/main/java/com/yahoo/sketches/hive/quantiles/GetQuantilesFromDoublesSketchUDF.java
@@ -50,7 +50,9 @@
   public List<Double> evaluate(final BytesWritable serializedSketch, final int number) {
     if (serializedSketch == null) { return null; }
     final DoublesSketch sketch = DoublesSketch.wrap(Memory.wrap(serializedSketch.getBytes()));
-    return Util.primitivesToList(sketch.getQuantiles(number));
+    final double[] quantiles = sketch.getQuantiles(number);
+    if (quantiles == null) { return null; }
+    return Util.primitivesToList(quantiles);
   }
 
 }
diff --git a/src/main/java/com/yahoo/sketches/hive/quantiles/GetQuantilesFromStringsSketchUDF.java b/src/main/java/com/yahoo/sketches/hive/quantiles/GetQuantilesFromStringsSketchUDF.java
index a6fddea..a57ba53 100644
--- a/src/main/java/com/yahoo/sketches/hive/quantiles/GetQuantilesFromStringsSketchUDF.java
+++ b/src/main/java/com/yahoo/sketches/hive/quantiles/GetQuantilesFromStringsSketchUDF.java
@@ -61,7 +61,9 @@
       Comparator.naturalOrder(),
       new ArrayOfStringsSerDe()
     );
-    return Arrays.asList(sketch.getQuantiles(number));
+    final String[] quantiles = sketch.getQuantiles(number);
+    if (quantiles == null) { return null; }
+    return Arrays.asList(quantiles);
   }
 
 }
diff --git a/src/main/java/com/yahoo/sketches/hive/tuple/DataToDoubleSummarySketchUDAF.java b/src/main/java/com/yahoo/sketches/hive/tuple/DataToDoubleSummarySketchUDAF.java
index 91d8b4b..03cd8df 100644
--- a/src/main/java/com/yahoo/sketches/hive/tuple/DataToDoubleSummarySketchUDAF.java
+++ b/src/main/java/com/yahoo/sketches/hive/tuple/DataToDoubleSummarySketchUDAF.java
@@ -13,8 +13,12 @@
 import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory;
 
 import com.yahoo.sketches.tuple.DoubleSummary;
+import com.yahoo.sketches.tuple.DoubleSummaryDeserializer;
 import com.yahoo.sketches.tuple.DoubleSummaryFactory;
+import com.yahoo.sketches.tuple.DoubleSummarySetOperations;
+import com.yahoo.sketches.tuple.SummaryDeserializer;
 import com.yahoo.sketches.tuple.SummaryFactory;
+import com.yahoo.sketches.tuple.SummarySetOperations;
 
 /**
  * This simple implementation is to give an example of a concrete UDAF based on the abstract
@@ -50,14 +54,28 @@
 
   static class DataToDoubleSummarySketchEvaluator extends DataToSketchEvaluator<Double, DoubleSummary> {
 
+    private static final SummaryDeserializer<DoubleSummary> SUMMARY_DESERIALIZER = new DoubleSummaryDeserializer();
+    private static final SummaryFactory<DoubleSummary> SUMMARY_FACTORY = new DoubleSummaryFactory();
+    private static final SummarySetOperations<DoubleSummary> SUMMARY_SET_OPS = new DoubleSummarySetOperations();
+
     @Override
-    protected SummaryFactory<DoubleSummary> getSummaryFactoryForIterate(final Object[] data) {
-      return new DoubleSummaryFactory();
+    protected SummaryDeserializer<DoubleSummary> getSummaryDeserializer() {
+      return SUMMARY_DESERIALIZER;
     }
 
     @Override
-    protected SummaryFactory<DoubleSummary> getSummaryFactoryForMerge(final Object data) {
-      return new DoubleSummaryFactory();
+    protected SummaryFactory<DoubleSummary> getSummaryFactory(final Object[] data) {
+      return SUMMARY_FACTORY;
+    }
+
+    @Override
+    protected SummarySetOperations<DoubleSummary> getSummarySetOperationsForIterate(final Object[] data) {
+      return SUMMARY_SET_OPS;
+    }
+
+    @Override
+    protected SummarySetOperations<DoubleSummary> getSummarySetOperationsForMerge(final Object data) {
+      return SUMMARY_SET_OPS;
     }
 
   }
diff --git a/src/main/java/com/yahoo/sketches/hive/tuple/DataToDoubleSummaryWithModeSketchUDAF.java b/src/main/java/com/yahoo/sketches/hive/tuple/DataToDoubleSummaryWithModeSketchUDAF.java
index 1d6670f..65daa0f 100644
--- a/src/main/java/com/yahoo/sketches/hive/tuple/DataToDoubleSummaryWithModeSketchUDAF.java
+++ b/src/main/java/com/yahoo/sketches/hive/tuple/DataToDoubleSummaryWithModeSketchUDAF.java
@@ -24,9 +24,13 @@
 import org.apache.hadoop.io.Text;
 
 import com.yahoo.sketches.tuple.DoubleSummary;
+import com.yahoo.sketches.tuple.DoubleSummaryDeserializer;
 import com.yahoo.sketches.tuple.DoubleSummaryFactory;
+import com.yahoo.sketches.tuple.DoubleSummarySetOperations;
 import com.yahoo.sketches.tuple.Sketch;
+import com.yahoo.sketches.tuple.SummaryDeserializer;
 import com.yahoo.sketches.tuple.SummaryFactory;
+import com.yahoo.sketches.tuple.SummarySetOperations;
 
 /**
  * This is an example of a concrete UDAF based on the abstract DataToSketchUDAF if extra arguments
@@ -75,6 +79,8 @@
   static class DataToDoubleSummaryWithModeSketchEvaluator
       extends DataToSketchEvaluator<Double, DoubleSummary> {
 
+    private static final SummaryDeserializer<DoubleSummary> SUMMARY_DESERIALIZER =
+        new DoubleSummaryDeserializer();
     private static final String SUMMARY_MODE_FIELD = "summaryMode";
     private PrimitiveObjectInspector summaryModeInspector_;
     private DoubleSummary.Mode summaryMode_;
@@ -83,6 +89,11 @@
       summaryMode_ = DoubleSummary.Mode.Sum;
     }
 
+    @Override
+    protected SummaryDeserializer<DoubleSummary> getSummaryDeserializer() {
+      return SUMMARY_DESERIALIZER;
+    }
+
     // need to add summary mode
     @Override
     public ObjectInspector init(final Mode mode, final ObjectInspector[] inspectors) throws HiveException {
@@ -108,7 +119,7 @@
     }
 
     @Override
-    protected SummaryFactory<DoubleSummary> getSummaryFactoryForIterate(final Object[] data) {
+    protected SummaryFactory<DoubleSummary> getSummaryFactory(final Object[] data) {
       if (summaryModeInspector_ != null) {
         summaryMode_ = DoubleSummary.Mode.valueOf(
           PrimitiveObjectInspectorUtils.getString(data[4], summaryModeInspector_)
@@ -117,6 +128,16 @@
       return new DoubleSummaryFactory(summaryMode_);
     }
 
+    @Override
+    protected SummarySetOperations<DoubleSummary> getSummarySetOperationsForIterate(final Object[] data) {
+      if (summaryModeInspector_ != null) {
+        summaryMode_ = DoubleSummary.Mode.valueOf(
+          PrimitiveObjectInspectorUtils.getString(data[4], summaryModeInspector_)
+        );
+      }
+      return new DoubleSummarySetOperations(summaryMode_);
+    }
+
     // need to add summary mode
     @Override
     public Object terminatePartial(final @SuppressWarnings("deprecation") AggregationBuffer buf)
@@ -134,10 +155,10 @@
     }
 
     @Override
-    protected SummaryFactory<DoubleSummary> getSummaryFactoryForMerge(final Object data) {
+    protected SummarySetOperations<DoubleSummary> getSummarySetOperationsForMerge(final Object data) {
       summaryMode_ = DoubleSummary.Mode.valueOf(((Text) intermediateInspector_.getStructFieldData(
           data, intermediateInspector_.getStructFieldRef(SUMMARY_MODE_FIELD))).toString());
-      return new DoubleSummaryFactory(summaryMode_);
+      return new DoubleSummarySetOperations(summaryMode_);
     }
 
   }
diff --git a/src/main/java/com/yahoo/sketches/hive/tuple/DataToSketchUDAF.java b/src/main/java/com/yahoo/sketches/hive/tuple/DataToSketchUDAF.java
index 74f511e..f48c9be 100644
--- a/src/main/java/com/yahoo/sketches/hive/tuple/DataToSketchUDAF.java
+++ b/src/main/java/com/yahoo/sketches/hive/tuple/DataToSketchUDAF.java
@@ -144,7 +144,7 @@
         samplingProbability = PrimitiveObjectInspectorUtils.getFloat(data[3],
             samplingProbabilityInspector_);
       }
-      state.init(nominalNumEntries, samplingProbability, getSummaryFactoryForIterate(data));
+      state.init(nominalNumEntries, samplingProbability, getSummaryFactory(data));
     }
 
     @SuppressWarnings("deprecation")
diff --git a/src/main/java/com/yahoo/sketches/hive/tuple/DoubleSummarySketchToEstimatesUDF.java b/src/main/java/com/yahoo/sketches/hive/tuple/DoubleSummarySketchToEstimatesUDF.java
index 47c1b3a..bfdbc34 100644
--- a/src/main/java/com/yahoo/sketches/hive/tuple/DoubleSummarySketchToEstimatesUDF.java
+++ b/src/main/java/com/yahoo/sketches/hive/tuple/DoubleSummarySketchToEstimatesUDF.java
@@ -14,9 +14,11 @@
 
 import com.yahoo.memory.Memory;
 import com.yahoo.sketches.tuple.DoubleSummary;
+import com.yahoo.sketches.tuple.DoubleSummaryDeserializer;
 import com.yahoo.sketches.tuple.Sketch;
 import com.yahoo.sketches.tuple.SketchIterator;
 import com.yahoo.sketches.tuple.Sketches;
+import com.yahoo.sketches.tuple.SummaryDeserializer;
 
 @Description(
     name = "DoubleSummarySketchToEstimates",
@@ -29,6 +31,9 @@
     + " This estimate assumes that the DoubleSummary was used in the Sum mode.)")
 public class DoubleSummarySketchToEstimatesUDF extends UDF {
 
+  private static final SummaryDeserializer<DoubleSummary> SUMMARY_DESERIALIZER =
+      new DoubleSummaryDeserializer();
+
   /**
    * Get estimates from a given Sketch&lt;DoubleSummary&gt;
    * @param serializedSketch DoubleSummarySketch in a serialized binary form
@@ -37,7 +42,7 @@
   public List<Double> evaluate(final BytesWritable serializedSketch) {
     if (serializedSketch == null) { return null; }
     final Sketch<DoubleSummary> sketch =
-        Sketches.heapifySketch(Memory.wrap(serializedSketch.getBytes()));
+        Sketches.heapifySketch(Memory.wrap(serializedSketch.getBytes()), SUMMARY_DESERIALIZER);
     double sum = 0;
     final SketchIterator<DoubleSummary> it = sketch.iterator();
     while (it.next()) {
diff --git a/src/main/java/com/yahoo/sketches/hive/tuple/DoubleSummarySketchToPercentileUDF.java b/src/main/java/com/yahoo/sketches/hive/tuple/DoubleSummarySketchToPercentileUDF.java
index d3989ff..3ac0e85 100644
--- a/src/main/java/com/yahoo/sketches/hive/tuple/DoubleSummarySketchToPercentileUDF.java
+++ b/src/main/java/com/yahoo/sketches/hive/tuple/DoubleSummarySketchToPercentileUDF.java
@@ -13,9 +13,11 @@
 import com.yahoo.sketches.quantiles.DoublesSketch;
 import com.yahoo.sketches.quantiles.UpdateDoublesSketch;
 import com.yahoo.sketches.tuple.DoubleSummary;
+import com.yahoo.sketches.tuple.DoubleSummaryDeserializer;
 import com.yahoo.sketches.tuple.Sketch;
 import com.yahoo.sketches.tuple.SketchIterator;
 import com.yahoo.sketches.tuple.Sketches;
+import com.yahoo.sketches.tuple.SummaryDeserializer;
 
 @Description(
     name = "DoubleSummarySketchToPercentile",
@@ -28,7 +30,9 @@
   + " distribution from the lower half)")
 public class DoubleSummarySketchToPercentileUDF extends UDF {
 
-  private static final int QUANTILES_SKETCH_SIZE = 1024;
+  private static final SummaryDeserializer<DoubleSummary> SUMMARY_DESERIALIZER =
+      new DoubleSummaryDeserializer();
+  private static final int QUANTILES_SKETCH_K = 1024;
 
   /**
    * Get percentile from a given Sketch&lt;DoubleSummary&gt;
@@ -42,8 +46,8 @@
       throw new IllegalArgumentException("percentile must be between 0 and 100");
     }
     final Sketch<DoubleSummary> sketch =
-        Sketches.heapifySketch(Memory.wrap(serializedSketch.getBytes()));
-    final UpdateDoublesSketch qs = DoublesSketch.builder().setK(QUANTILES_SKETCH_SIZE).build();
+        Sketches.heapifySketch(Memory.wrap(serializedSketch.getBytes()), SUMMARY_DESERIALIZER);
+    final UpdateDoublesSketch qs = DoublesSketch.builder().setK(QUANTILES_SKETCH_K).build();
     final SketchIterator<DoubleSummary> it = sketch.iterator();
     while (it.next()) {
       qs.update(it.getSummary().getValue());
diff --git a/src/main/java/com/yahoo/sketches/hive/tuple/SketchEvaluator.java b/src/main/java/com/yahoo/sketches/hive/tuple/SketchEvaluator.java
index e849488..2ccaa28 100644
--- a/src/main/java/com/yahoo/sketches/hive/tuple/SketchEvaluator.java
+++ b/src/main/java/com/yahoo/sketches/hive/tuple/SketchEvaluator.java
@@ -18,7 +18,9 @@
 import com.yahoo.sketches.tuple.Sketch;
 import com.yahoo.sketches.tuple.Sketches;
 import com.yahoo.sketches.tuple.Summary;
+import com.yahoo.sketches.tuple.SummaryDeserializer;
 import com.yahoo.sketches.tuple.SummaryFactory;
+import com.yahoo.sketches.tuple.SummarySetOperations;
 
 abstract class SketchEvaluator<S extends Summary> extends GenericUDAFEvaluator {
 
@@ -29,12 +31,28 @@
   protected StructObjectInspector intermediateInspector_;
 
   /**
-   * Get an instance of SummaryFactory possibly parameterized based on the original input array of objects.
-   * Called once during the first call to iterate.
+   * Get an instance of SummaryDeserializer
+   * @return SummaryDeserializer
+   */
+  protected abstract SummaryDeserializer<S> getSummaryDeserializer();
+
+  /**
+   * Get an instance of SummaryFactory possibly parameterized
+   * based on the original input array of objects.
+   * Might be called once during the first call to iterate.
    * @param data original input array of objects
    * @return an instance of SummaryFactory
    */
-  protected abstract SummaryFactory<S> getSummaryFactoryForIterate(Object[] data);
+  protected abstract SummaryFactory<S> getSummaryFactory(Object[] data);
+
+  /**
+   * Get an instance of SummarySetOperations possibly parameterized
+   * based on the original input array of objects.
+   * Might be called once during the first call to iterate.
+   * @param data original input array of objects
+   * @return an instance of SummarySetOperations
+   */
+  protected abstract SummarySetOperations<S> getSummarySetOperationsForIterate(Object[] data);
 
   @Override
   public Object terminatePartial(final @SuppressWarnings("deprecation") AggregationBuffer buf)
@@ -62,22 +80,23 @@
     final BytesWritable serializedSketch =
         (BytesWritable) intermediateInspector_.getStructFieldData(
             data, intermediateInspector_.getStructFieldRef(SKETCH_FIELD));
-    state.update(Sketches.heapifySketch(Memory.wrap(serializedSketch.getBytes())));
+    state.update(Sketches.heapifySketch(Memory.wrap(serializedSketch.getBytes()), getSummaryDeserializer()));
   }
 
   protected void initializeState(final UnionState<S> state, final Object data) {
     final int nominalNumEntries = ((IntWritable) intermediateInspector_.getStructFieldData(
         data, intermediateInspector_.getStructFieldRef(NOMINAL_NUM_ENTRIES_FIELD))).get();
-    state.init(nominalNumEntries, getSummaryFactoryForMerge(data));
+    state.init(nominalNumEntries, getSummarySetOperationsForMerge(data));
   }
 
   /**
-   * Get an instance of SummaryFactory possibly parameterized based on the intermediate data object.
-   * Called once during the first call to merge.
+   * Get an instance of SummarySetOperations possibly parameterized
+   * based on the intermediate data object.
+   * Might be called once during the first call to merge.
    * @param data intermediate data object
-   * @return an instance of SummaryFactory
+   * @return an instance of SummarySetOperations
    */
-  protected abstract SummaryFactory<S> getSummaryFactoryForMerge(Object data);
+  protected abstract SummarySetOperations<S> getSummarySetOperationsForMerge(Object data);
 
   @Override
   public Object terminate(final @SuppressWarnings("deprecation") AggregationBuffer buf)
diff --git a/src/main/java/com/yahoo/sketches/hive/tuple/UnionDoubleSummarySketchUDAF.java b/src/main/java/com/yahoo/sketches/hive/tuple/UnionDoubleSummarySketchUDAF.java
index 0fd9526..01d2ed8 100644
--- a/src/main/java/com/yahoo/sketches/hive/tuple/UnionDoubleSummarySketchUDAF.java
+++ b/src/main/java/com/yahoo/sketches/hive/tuple/UnionDoubleSummarySketchUDAF.java
@@ -9,8 +9,11 @@
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator;
 
 import com.yahoo.sketches.tuple.DoubleSummary;
-import com.yahoo.sketches.tuple.DoubleSummaryFactory;
+import com.yahoo.sketches.tuple.DoubleSummaryDeserializer;
+import com.yahoo.sketches.tuple.DoubleSummarySetOperations;
+import com.yahoo.sketches.tuple.SummaryDeserializer;
 import com.yahoo.sketches.tuple.SummaryFactory;
+import com.yahoo.sketches.tuple.SummarySetOperations;
 
 /**
  * This simple implementation is to give an example of a concrete UDAF based on the abstract
@@ -37,14 +40,27 @@
 
   public static class UnionDoubleSummarySketchEvaluator extends UnionSketchEvaluator<DoubleSummary> {
 
+    private static final SummaryDeserializer<DoubleSummary> SUMMARY_DESERIALIZER = new DoubleSummaryDeserializer();
+    private static final SummarySetOperations<DoubleSummary> SUMMARY_SET_OPS = new DoubleSummarySetOperations();
+
     @Override
-    protected SummaryFactory<DoubleSummary> getSummaryFactoryForIterate(final Object[] data) {
-      return new DoubleSummaryFactory();
+    protected SummaryDeserializer<DoubleSummary> getSummaryDeserializer() {
+      return SUMMARY_DESERIALIZER;
     }
 
     @Override
-    protected SummaryFactory<DoubleSummary> getSummaryFactoryForMerge(final Object data) {
-      return new DoubleSummaryFactory();
+    protected SummaryFactory<DoubleSummary> getSummaryFactory(final Object[] data) {
+      return null; // union never needs to create new instances
+    }
+
+    @Override
+    protected SummarySetOperations<DoubleSummary> getSummarySetOperationsForIterate(final Object[] data) {
+      return SUMMARY_SET_OPS;
+    }
+
+    @Override
+    protected SummarySetOperations<DoubleSummary> getSummarySetOperationsForMerge(final Object data) {
+      return SUMMARY_SET_OPS;
     }
 
   }
diff --git a/src/main/java/com/yahoo/sketches/hive/tuple/UnionDoubleSummaryWithModeSketchUDAF.java b/src/main/java/com/yahoo/sketches/hive/tuple/UnionDoubleSummaryWithModeSketchUDAF.java
index 10efccc..aa7c047 100644
--- a/src/main/java/com/yahoo/sketches/hive/tuple/UnionDoubleSummaryWithModeSketchUDAF.java
+++ b/src/main/java/com/yahoo/sketches/hive/tuple/UnionDoubleSummaryWithModeSketchUDAF.java
@@ -23,9 +23,13 @@
 import org.apache.hadoop.io.Text;
 
 import com.yahoo.sketches.tuple.DoubleSummary;
+import com.yahoo.sketches.tuple.DoubleSummaryDeserializer;
 import com.yahoo.sketches.tuple.DoubleSummaryFactory;
+import com.yahoo.sketches.tuple.DoubleSummarySetOperations;
 import com.yahoo.sketches.tuple.Sketch;
+import com.yahoo.sketches.tuple.SummaryDeserializer;
 import com.yahoo.sketches.tuple.SummaryFactory;
+import com.yahoo.sketches.tuple.SummarySetOperations;
 
 /**
  * This is an example of a concrete UDAF based on the abstract UnionSketchUDAF if extra arguments
@@ -64,6 +68,8 @@
 
   public static class UnionDoubleSummaryWithModeSketchEvaluator extends UnionSketchEvaluator<DoubleSummary> {
 
+    private static final SummaryDeserializer<DoubleSummary> SUMMARY_DESERIALIZER =
+        new DoubleSummaryDeserializer();
     private static final String SUMMARY_MODE_FIELD = "summaryMode";
     private PrimitiveObjectInspector summaryModeInspector_;
     private DoubleSummary.Mode summaryMode_;
@@ -72,6 +78,11 @@
       summaryMode_ = DoubleSummary.Mode.Sum;
     }
 
+    @Override
+    protected SummaryDeserializer<DoubleSummary> getSummaryDeserializer() {
+      return SUMMARY_DESERIALIZER;
+    }
+
     // need to add summary mode
     @Override
     public ObjectInspector init(final Mode mode, final ObjectInspector[] inspectors) throws HiveException {
@@ -97,13 +108,18 @@
     }
 
     @Override
-    protected SummaryFactory<DoubleSummary> getSummaryFactoryForIterate(final Object[] data) {
+    protected SummaryFactory<DoubleSummary> getSummaryFactory(final Object[] data) {
+      return null; // union never needs to create new instances
+    }
+
+    @Override
+    protected SummarySetOperations<DoubleSummary> getSummarySetOperationsForIterate(final Object[] data) {
       if (summaryModeInspector_ != null) {
         summaryMode_ = DoubleSummary.Mode.valueOf(
           PrimitiveObjectInspectorUtils.getString(data[2], summaryModeInspector_)
         );
       }
-      return new DoubleSummaryFactory(summaryMode_);
+      return new DoubleSummarySetOperations(summaryMode_);
     }
 
     // need to add summary mode
@@ -123,10 +139,10 @@
     }
 
     @Override
-    protected SummaryFactory<DoubleSummary> getSummaryFactoryForMerge(final Object data) {
+    protected SummarySetOperations<DoubleSummary> getSummarySetOperationsForMerge(final Object data) {
       summaryMode_ = DoubleSummary.Mode.valueOf(((Text) intermediateInspector_.getStructFieldData(
           data, intermediateInspector_.getStructFieldRef(SUMMARY_MODE_FIELD))).toString());
-      return new DoubleSummaryFactory(summaryMode_);
+      return new DoubleSummarySetOperations(summaryMode_);
     }
 
   }
diff --git a/src/main/java/com/yahoo/sketches/hive/tuple/UnionSketchUDAF.java b/src/main/java/com/yahoo/sketches/hive/tuple/UnionSketchUDAF.java
index 3936e08..eeb259c 100644
--- a/src/main/java/com/yahoo/sketches/hive/tuple/UnionSketchUDAF.java
+++ b/src/main/java/com/yahoo/sketches/hive/tuple/UnionSketchUDAF.java
@@ -111,7 +111,7 @@
       }
       final byte[] serializedSketch = (byte[]) sketchInspector_.getPrimitiveJavaObject(data[0]);
       if (serializedSketch == null) { return; }
-      state.update(Sketches.heapifySketch(Memory.wrap(serializedSketch)));
+      state.update(Sketches.heapifySketch(Memory.wrap(serializedSketch), getSummaryDeserializer()));
     }
 
     protected void initializeState(final UnionState<S> state, final Object[] data) {
@@ -119,7 +119,7 @@
       if (nominalNumEntriesInspector_ != null) {
         nominalNumEntries = PrimitiveObjectInspectorUtils.getInt(data[1], nominalNumEntriesInspector_);
       }
-      state.init(nominalNumEntries, getSummaryFactoryForIterate(data));
+      state.init(nominalNumEntries, getSummarySetOperationsForIterate(data));
     }
 
     @SuppressWarnings("deprecation")
diff --git a/src/main/java/com/yahoo/sketches/hive/tuple/UnionState.java b/src/main/java/com/yahoo/sketches/hive/tuple/UnionState.java
index 305602d..0ca1624 100644
--- a/src/main/java/com/yahoo/sketches/hive/tuple/UnionState.java
+++ b/src/main/java/com/yahoo/sketches/hive/tuple/UnionState.java
@@ -7,7 +7,7 @@
 
 import com.yahoo.sketches.tuple.Sketch;
 import com.yahoo.sketches.tuple.Summary;
-import com.yahoo.sketches.tuple.SummaryFactory;
+import com.yahoo.sketches.tuple.SummarySetOperations;
 import com.yahoo.sketches.tuple.Union;
 
 class UnionState<S extends Summary> extends State<S> {
@@ -18,9 +18,9 @@
     return union_ != null;
   }
 
-  void init(final int nominalNumEntries, final SummaryFactory<S> summaryFactory) {
+  void init(final int nominalNumEntries, final SummarySetOperations<S> summarySetOps) {
     super.init(nominalNumEntries);
-    union_ = new Union<S>(nominalNumEntries, summaryFactory);
+    union_ = new Union<S>(nominalNumEntries, summarySetOps);
   }
 
   void update(final Sketch<S> sketch) {
diff --git a/src/test/java/com/yahoo/sketches/hive/quantiles/GetPmfFromDoublesSketchUDFTest.java b/src/test/java/com/yahoo/sketches/hive/quantiles/GetPmfFromDoublesSketchUDFTest.java
index 52feedf..f9e67d0 100644
--- a/src/test/java/com/yahoo/sketches/hive/quantiles/GetPmfFromDoublesSketchUDFTest.java
+++ b/src/test/java/com/yahoo/sketches/hive/quantiles/GetPmfFromDoublesSketchUDFTest.java
@@ -34,6 +34,13 @@
   }
 
   @Test
+  public void emptySketch() {
+    UpdateDoublesSketch sketch = DoublesSketch.builder().build();
+    List<Double> result = new GetPmfFromDoublesSketchUDF().evaluate(new BytesWritable(sketch.toByteArray()), 0.0);
+    Assert.assertNull(result);
+  }
+
+  @Test
   public void normalCase() {
     UpdateDoublesSketch sketch = DoublesSketch.builder().build();
     sketch.update(1);
diff --git a/src/test/java/com/yahoo/sketches/hive/quantiles/GetPmfFromStringsSketchUDFTest.java b/src/test/java/com/yahoo/sketches/hive/quantiles/GetPmfFromStringsSketchUDFTest.java
index 163caba..f3b2dd0 100644
--- a/src/test/java/com/yahoo/sketches/hive/quantiles/GetPmfFromStringsSketchUDFTest.java
+++ b/src/test/java/com/yahoo/sketches/hive/quantiles/GetPmfFromStringsSketchUDFTest.java
@@ -40,6 +40,13 @@
   }
 
   @Test
+  public void emptySketch() {
+    ItemsSketch<String> sketch = ItemsSketch.getInstance(comparator);
+    List<Double> result = new GetPmfFromStringsSketchUDF().evaluate(new BytesWritable(sketch.toByteArray(serDe)), "a");
+    Assert.assertNull(result);
+  }
+
+  @Test
   public void normalCase() {
     ItemsSketch<String> sketch = ItemsSketch.getInstance(comparator);
     sketch.update("a");
diff --git a/src/test/java/com/yahoo/sketches/hive/quantiles/GetQuantilesFromDoublesSketchUDFTest.java b/src/test/java/com/yahoo/sketches/hive/quantiles/GetQuantilesFromDoublesSketchUDFTest.java
index 99f671e..62b57a5 100644
--- a/src/test/java/com/yahoo/sketches/hive/quantiles/GetQuantilesFromDoublesSketchUDFTest.java
+++ b/src/test/java/com/yahoo/sketches/hive/quantiles/GetQuantilesFromDoublesSketchUDFTest.java
@@ -47,9 +47,17 @@
     Assert.assertEquals(result.get(2), 3.0);
   }
 
+  @Test
+  public void evenlySpacedEmptySketch() {
+    UpdateDoublesSketch sketch = DoublesSketch.builder().build();
+    List<Double> result = new GetQuantilesFromDoublesSketchUDF().evaluate(new BytesWritable(sketch.toByteArray()), 1);
+    Assert.assertNull(result);
+  }
+
   @Test(expectedExceptions = SketchesArgumentException.class)
   public void evenlySpacedZero() {
     UpdateDoublesSketch sketch = DoublesSketch.builder().build();
+    sketch.update(1);
     new GetQuantilesFromDoublesSketchUDF().evaluate(new BytesWritable(sketch.toByteArray()), 0);
   }
 
diff --git a/src/test/java/com/yahoo/sketches/hive/quantiles/GetQuantilesFromStringsSketchUDFTest.java b/src/test/java/com/yahoo/sketches/hive/quantiles/GetQuantilesFromStringsSketchUDFTest.java
index 7e91a28..257af1b 100644
--- a/src/test/java/com/yahoo/sketches/hive/quantiles/GetQuantilesFromStringsSketchUDFTest.java
+++ b/src/test/java/com/yahoo/sketches/hive/quantiles/GetQuantilesFromStringsSketchUDFTest.java
@@ -56,11 +56,19 @@
   @Test(expectedExceptions = SketchesArgumentException.class)
   public void evenlySpacedZero() {
     ItemsSketch<String> sketch = ItemsSketch.getInstance(comparator);
+    sketch.update("a");
     new GetQuantilesFromStringsSketchUDF()
       .evaluate(new BytesWritable(sketch.toByteArray(serDe)), 0);
   }
 
   @Test
+  public void evenlySpacedEmptySketch() {
+    ItemsSketch<String> sketch = ItemsSketch.getInstance(comparator);
+    List<String> result = new GetQuantilesFromStringsSketchUDF().evaluate(new BytesWritable(sketch.toByteArray(serDe)), 1);
+    Assert.assertNull(result);
+  }
+
+  @Test
   public void evenlySpacedNormalCase() {
     ItemsSketch<String> sketch = ItemsSketch.getInstance(comparator);
     sketch.update("a");
diff --git a/src/test/java/com/yahoo/sketches/hive/tuple/DataToDoubleSummarySketchUDAFTest.java b/src/test/java/com/yahoo/sketches/hive/tuple/DataToDoubleSummarySketchUDAFTest.java
index 5cf057e..16c2696 100644
--- a/src/test/java/com/yahoo/sketches/hive/tuple/DataToDoubleSummarySketchUDAFTest.java
+++ b/src/test/java/com/yahoo/sketches/hive/tuple/DataToDoubleSummarySketchUDAFTest.java
@@ -34,6 +34,7 @@
 
 import com.yahoo.memory.Memory;
 import com.yahoo.sketches.tuple.DoubleSummary;
+import com.yahoo.sketches.tuple.DoubleSummaryDeserializer;
 import com.yahoo.sketches.tuple.DoubleSummaryFactory;
 import com.yahoo.sketches.tuple.Sketch;
 import com.yahoo.sketches.tuple.Sketches;
@@ -145,7 +146,8 @@
       List<?> r = (List<?>) result;
       Assert.assertEquals(r.size(), 2);
       Assert.assertEquals(((IntWritable) r.get(0)).get(), DEFAULT_NOMINAL_ENTRIES);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) r.get(1)).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) r.get(1)).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertFalse(resultSketch.isEstimationMode());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
     }
@@ -170,7 +172,8 @@
       List<?> r = (List<?>) result;
       Assert.assertEquals(r.size(), 2);
       Assert.assertEquals(((IntWritable) r.get(0)).get(), 32);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) r.get(1)).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) r.get(1)).getBytes()), new DoubleSummaryDeserializer());
       // because of sampling probability < 1
       Assert.assertTrue(resultSketch.isEstimationMode());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0, 0.05);
@@ -209,7 +212,8 @@
       List<?> r = (List<?>) result;
       Assert.assertEquals(r.size(), 2);
       Assert.assertEquals(((IntWritable) r.get(0)).get(), DEFAULT_NOMINAL_ENTRIES);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) r.get(1)).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) r.get(1)).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
   
       eval.reset(state);
@@ -247,7 +251,8 @@
       Object result = eval.terminate(state);
       Assert.assertNotNull(result);
       Assert.assertTrue(result instanceof BytesWritable);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) result).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) result).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
     }
   }
@@ -269,7 +274,8 @@
       Object result = eval.terminate(state);
       Assert.assertNotNull(result);
       Assert.assertTrue(result instanceof BytesWritable);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) result).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) result).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
   
       eval.reset(state);
@@ -295,7 +301,8 @@
       Object result = eval.terminate(state);
       Assert.assertNotNull(result);
       Assert.assertTrue(result instanceof BytesWritable);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) result).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) result).getBytes()), new DoubleSummaryDeserializer());
       // because of sampling probability < 1
       Assert.assertTrue(resultSketch.isEstimationMode());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0, 0.05);
@@ -323,7 +330,8 @@
       Object result = eval.terminate(state);
       Assert.assertNotNull(result);
       Assert.assertTrue(result instanceof BytesWritable);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) result).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) result).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 10000.0, 10000 * 0.03);
       Assert.assertTrue(resultSketch.getRetainedEntries() <= 4096, "retained entries: " + resultSketch.getRetainedEntries());
   
diff --git a/src/test/java/com/yahoo/sketches/hive/tuple/DataToDoubleSummaryWithModeSketchUDAFTest.java b/src/test/java/com/yahoo/sketches/hive/tuple/DataToDoubleSummaryWithModeSketchUDAFTest.java
index 137b50f..49bbdc1 100644
--- a/src/test/java/com/yahoo/sketches/hive/tuple/DataToDoubleSummaryWithModeSketchUDAFTest.java
+++ b/src/test/java/com/yahoo/sketches/hive/tuple/DataToDoubleSummaryWithModeSketchUDAFTest.java
@@ -34,6 +34,7 @@
 
 import com.yahoo.memory.Memory;
 import com.yahoo.sketches.tuple.DoubleSummary;
+import com.yahoo.sketches.tuple.DoubleSummaryDeserializer;
 import com.yahoo.sketches.tuple.DoubleSummaryFactory;
 import com.yahoo.sketches.tuple.Sketch;
 import com.yahoo.sketches.tuple.SketchIterator;
@@ -149,7 +150,8 @@
       Assert.assertEquals(r.size(), 3);
       Assert.assertEquals(((IntWritable) r.get(0)).get(), DEFAULT_NOMINAL_ENTRIES);
       Assert.assertEquals(((Text) r.get(1)).toString(), DoubleSummary.Mode.Sum.toString());
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) r.get(2)).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) r.get(2)).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertFalse(resultSketch.isEstimationMode());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
       SketchIterator<DoubleSummary> it = resultSketch.iterator();
@@ -181,7 +183,8 @@
       Assert.assertEquals(r.size(), 3);
       Assert.assertEquals(((IntWritable) r.get(0)).get(), 32);
       Assert.assertEquals(((Text) r.get(1)).toString(), DoubleSummary.Mode.Min.toString());
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) r.get(2)).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) r.get(2)).getBytes()), new DoubleSummaryDeserializer());
       // because of sampling probability < 1
       Assert.assertTrue(resultSketch.isEstimationMode());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0, 0.05);
@@ -229,7 +232,8 @@
       Assert.assertEquals(r.size(), 3);
       Assert.assertEquals(((IntWritable) r.get(0)).get(), DEFAULT_NOMINAL_ENTRIES);
       Assert.assertEquals(((Text) r.get(1)).toString(), DoubleSummary.Mode.Sum.toString());
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) r.get(2)).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) r.get(2)).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
       SketchIterator<DoubleSummary> it = resultSketch.iterator();
       while (it.next()) {
@@ -275,7 +279,8 @@
       Object result = eval.terminate(state);
       Assert.assertNotNull(result);
       Assert.assertTrue(result instanceof BytesWritable);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) result).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) result).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
       SketchIterator<DoubleSummary> it = resultSketch.iterator();
       while (it.next()) {
@@ -303,7 +308,8 @@
       Object result = eval.terminate(state);
       Assert.assertNotNull(result);
       Assert.assertTrue(result instanceof BytesWritable);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) result).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) result).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
       SketchIterator<DoubleSummary> it = resultSketch.iterator();
       while (it.next()) {
@@ -335,7 +341,8 @@
       Object result = eval.terminate(state);
       Assert.assertNotNull(result);
       Assert.assertTrue(result instanceof BytesWritable);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) result).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) result).getBytes()), new DoubleSummaryDeserializer());
       // because of sampling probability < 1
       Assert.assertTrue(resultSketch.isEstimationMode());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0, 0.05);
@@ -367,7 +374,8 @@
       Object result = eval.terminate(state);
       Assert.assertNotNull(result);
       Assert.assertTrue(result instanceof BytesWritable);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) result).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) result).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 10000.0, 10000 * 0.03);
       Assert.assertTrue(resultSketch.getRetainedEntries() <= 4096, "retained entries: " + resultSketch.getRetainedEntries());
   
diff --git a/src/test/java/com/yahoo/sketches/hive/tuple/DoubleSummarySketchToPercentileUDFTest.java b/src/test/java/com/yahoo/sketches/hive/tuple/DoubleSummarySketchToPercentileUDFTest.java
index 7ce2f0f..bf5716b 100644
--- a/src/test/java/com/yahoo/sketches/hive/tuple/DoubleSummarySketchToPercentileUDFTest.java
+++ b/src/test/java/com/yahoo/sketches/hive/tuple/DoubleSummarySketchToPercentileUDFTest.java
@@ -27,7 +27,7 @@
     UpdatableSketch<Double, DoubleSummary> sketch = new UpdatableSketchBuilder<Double, DoubleSummary>(new DoubleSummaryFactory()).build();
     Double result = new DoubleSummarySketchToPercentileUDF().evaluate(new BytesWritable(sketch.compact().toByteArray()), 0.0);
     Assert.assertNotNull(result);
-    Assert.assertEquals(result, Double.POSITIVE_INFINITY);
+    Assert.assertEquals(result, Double.NaN);
   }
 
   @Test
diff --git a/src/test/java/com/yahoo/sketches/hive/tuple/UnionDoubleSummarySketchUDAFTest.java b/src/test/java/com/yahoo/sketches/hive/tuple/UnionDoubleSummarySketchUDAFTest.java
index 825ccb2..929588d 100644
--- a/src/test/java/com/yahoo/sketches/hive/tuple/UnionDoubleSummarySketchUDAFTest.java
+++ b/src/test/java/com/yahoo/sketches/hive/tuple/UnionDoubleSummarySketchUDAFTest.java
@@ -28,6 +28,7 @@
 
 import com.yahoo.memory.Memory;
 import com.yahoo.sketches.tuple.DoubleSummary;
+import com.yahoo.sketches.tuple.DoubleSummaryDeserializer;
 import com.yahoo.sketches.tuple.DoubleSummaryFactory;
 import com.yahoo.sketches.tuple.Sketch;
 import com.yahoo.sketches.tuple.Sketches;
@@ -118,7 +119,8 @@
       List<?> r = (List<?>) result;
       Assert.assertEquals(r.size(), 2);
       Assert.assertEquals(((IntWritable) (r.get(0))).get(), DEFAULT_NOMINAL_ENTRIES);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) (r.get(1))).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) (r.get(1))).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
     }
   }
@@ -153,7 +155,8 @@
       List<?> r = (List<?>) result;
       Assert.assertEquals(r.size(), 2);
       Assert.assertEquals(((IntWritable) (r.get(0))).get(), nomNumEntries);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) (r.get(1))).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) (r.get(1))).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
     }
   }
@@ -190,7 +193,8 @@
       List<?> r = (List<?>) result;
       Assert.assertEquals(r.size(), 2);
       Assert.assertEquals(((IntWritable) (r.get(0))).get(), DEFAULT_NOMINAL_ENTRIES);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) (r.get(1))).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) (r.get(1))).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
   
       eval.reset(state);
@@ -228,7 +232,8 @@
       Object result = eval.terminate(state);
       Assert.assertNotNull(result);
       Assert.assertTrue(result instanceof BytesWritable);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) result).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) result).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
     }
   }
@@ -256,7 +261,8 @@
       Object result = eval.terminate(state);
       Assert.assertNotNull(result);
       Assert.assertTrue(result instanceof BytesWritable);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) result).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) result).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
   
       eval.reset(state);
@@ -292,7 +298,8 @@
       Object result = eval.terminate(state);
       Assert.assertNotNull(result);
       Assert.assertTrue(result instanceof BytesWritable);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) result).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) result).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0, 0.05);
   
       eval.reset(state);
diff --git a/src/test/java/com/yahoo/sketches/hive/tuple/UnionDoubleSummaryWithModeSketchUDAFTest.java b/src/test/java/com/yahoo/sketches/hive/tuple/UnionDoubleSummaryWithModeSketchUDAFTest.java
index 0605e53..03b4b4a 100644
--- a/src/test/java/com/yahoo/sketches/hive/tuple/UnionDoubleSummaryWithModeSketchUDAFTest.java
+++ b/src/test/java/com/yahoo/sketches/hive/tuple/UnionDoubleSummaryWithModeSketchUDAFTest.java
@@ -32,6 +32,7 @@
 
 import com.yahoo.memory.Memory;
 import com.yahoo.sketches.tuple.DoubleSummary;
+import com.yahoo.sketches.tuple.DoubleSummaryDeserializer;
 import com.yahoo.sketches.tuple.DoubleSummaryFactory;
 import com.yahoo.sketches.tuple.Sketch;
 import com.yahoo.sketches.tuple.SketchIterator;
@@ -143,7 +144,8 @@
       Assert.assertEquals(r.size(), 3);
       Assert.assertEquals(((IntWritable) r.get(0)).get(), DEFAULT_NOMINAL_ENTRIES);
       Assert.assertEquals(((Text) r.get(1)).toString(), DoubleSummary.Mode.Sum.toString());
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) r.get(2)).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) r.get(2)).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
       SketchIterator<DoubleSummary> it = resultSketch.iterator();
       while (it.next()) {
@@ -185,7 +187,8 @@
       Assert.assertEquals(r.size(), 3);
       Assert.assertEquals(((IntWritable) r.get(0)).get(), nomNumEntries);
       Assert.assertEquals(((Text) r.get(1)).toString(), DoubleSummary.Mode.Max.toString());
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) r.get(2)).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) r.get(2)).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
       SketchIterator<DoubleSummary> it = resultSketch.iterator();
       while (it.next()) {
@@ -231,7 +234,8 @@
       Assert.assertEquals(r.size(), 3);
       Assert.assertEquals(((IntWritable) r.get(0)).get(), DEFAULT_NOMINAL_ENTRIES);
       Assert.assertEquals(((Text) r.get(1)).toString(), DoubleSummary.Mode.Sum.toString());
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) r.get(2)).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) r.get(2)).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
       SketchIterator<DoubleSummary> it = resultSketch.iterator();
       while (it.next()) {
@@ -277,7 +281,8 @@
       Object result = eval.terminate(state);
       Assert.assertNotNull(result);
       Assert.assertTrue(result instanceof BytesWritable);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) result).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) result).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
       SketchIterator<DoubleSummary> it = resultSketch.iterator();
       while (it.next()) {
@@ -311,7 +316,8 @@
       Object result = eval.terminate(state);
       Assert.assertNotNull(result);
       Assert.assertTrue(result instanceof BytesWritable);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) result).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) result).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
       SketchIterator<DoubleSummary> it = resultSketch.iterator();
       while (it.next()) {
@@ -353,7 +359,8 @@
       Object result = eval.terminate(state);
       Assert.assertNotNull(result);
       Assert.assertTrue(result instanceof BytesWritable);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) result).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) result).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
       SketchIterator<DoubleSummary> it = resultSketch.iterator();
       while (it.next()) {
@@ -395,7 +402,8 @@
       Object result = eval.terminate(state);
       Assert.assertNotNull(result);
       Assert.assertTrue(result instanceof BytesWritable);
-      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(Memory.wrap(((BytesWritable) result).getBytes()));
+      Sketch<DoubleSummary> resultSketch = Sketches.heapifySketch(
+          Memory.wrap(((BytesWritable) result).getBytes()), new DoubleSummaryDeserializer());
       Assert.assertEquals(resultSketch.getEstimate(), 2.0);
       SketchIterator<DoubleSummary> it = resultSketch.iterator();
       while (it.next()) {