You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ec...@apache.org on 2013/07/25 04:39:31 UTC

svn commit: r1506810 - in /hive/trunk/ql/src: java/org/apache/hadoop/hive/ql/exec/Utilities.java test/org/apache/hadoop/hive/ql/exec/TestUtilities.java

Author: ecapriolo
Date: Thu Jul 25 02:39:31 2013
New Revision: 1506810

URL: http://svn.apache.org/r1506810
Log:
HIVE-4222 Timestamp type constants can not be deserialized in jdk 1.6 or less (Navis Ryu and Jason Dere via egc)

Submitted by: Jason Dere	
Reviewed by: Edward Capriolo	

Modified:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java
    hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestUtilities.java

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java?rev=1506810&r1=1506809&r2=1506810&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java Thu Jul 25 02:39:31 2013
@@ -22,6 +22,7 @@ import java.beans.DefaultPersistenceDele
 import java.beans.Encoder;
 import java.beans.ExceptionListener;
 import java.beans.Expression;
+import java.beans.PersistenceDelegate;
 import java.beans.Statement;
 import java.beans.XMLDecoder;
 import java.beans.XMLEncoder;
@@ -50,12 +51,14 @@ import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.sql.SQLTransientException;
+import java.sql.Timestamp;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -376,6 +379,41 @@ public final class Utilities {
 
   }
 
+  /**
+   * DatePersistenceDelegate. Needed to serialize java.util.Date
+   * since it is not serialization friendly.
+   * Also works for java.sql.Date since it derives from java.util.Date.
+   */
+  public static class DatePersistenceDelegate extends PersistenceDelegate {
+
+    @Override
+    protected Expression instantiate(Object oldInstance, Encoder out) {
+      Date dateVal = (Date)oldInstance;
+      Object[] args = { dateVal.getTime() };
+      return new Expression(dateVal, dateVal.getClass(), "new", args);
+    }
+
+    protected boolean mutatesTo(Object oldInstance, Object newInstance) {
+      if (oldInstance == null || newInstance == null) {
+        return false;
+      }
+      return oldInstance.getClass() == newInstance.getClass();
+    }
+  }
+
+  /**
+   * TimestampPersistenceDelegate. Needed to serialize java.sql.Timestamp since
+   * it is not serialization friendly.
+   */
+  public static class TimestampPersistenceDelegate extends DatePersistenceDelegate {
+    protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder out) {
+      Timestamp ts = (Timestamp)oldInstance;
+      Object[] args = { ts.getNanos() };
+      Statement stmt = new Statement(oldInstance, "setNanos", args);
+      out.writeStatement(stmt);
+    }
+  }
+
   public static void setMapRedWork(Configuration job, MapredWork w, String hiveScratchDir) {
     try {
 
@@ -424,6 +462,8 @@ public final class Utilities {
   public static String serializeExpression(ExprNodeDesc expr) {
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     XMLEncoder encoder = new XMLEncoder(baos);
+    encoder.setPersistenceDelegate(java.sql.Date.class, new DatePersistenceDelegate());
+    encoder.setPersistenceDelegate(Timestamp.class, new TimestampPersistenceDelegate());
     try {
       encoder.writeObject(expr);
     } finally {
@@ -466,7 +506,8 @@ public final class Utilities {
       e.setPersistenceDelegate(ExpressionTypes.class, new EnumDelegate());
       e.setPersistenceDelegate(GroupByDesc.Mode.class, new EnumDelegate());
       e.setPersistenceDelegate(Operator.ProgressCounter.class, new EnumDelegate());
-
+      e.setPersistenceDelegate(java.sql.Date.class, new DatePersistenceDelegate());
+      e.setPersistenceDelegate(Timestamp.class, new TimestampPersistenceDelegate());
       e.writeObject(t);
     } finally {
       if (null != e) {
@@ -505,6 +546,8 @@ public final class Utilities {
     e.setPersistenceDelegate(ExpressionTypes.class, new EnumDelegate());
     e.setPersistenceDelegate(GroupByDesc.Mode.class, new EnumDelegate());
     e.setPersistenceDelegate(Operator.ProgressCounter.class, new EnumDelegate());
+    e.setPersistenceDelegate(java.sql.Date.class, new DatePersistenceDelegate());
+    e.setPersistenceDelegate(Timestamp.class, new TimestampPersistenceDelegate());
 
     e.setPersistenceDelegate(org.datanucleus.sco.backed.Map.class, new MapDelegate());
     e.setPersistenceDelegate(org.datanucleus.sco.backed.List.class, new ListDelegate());
@@ -540,6 +583,8 @@ public final class Utilities {
       // workaround for java 1.5
       e.setPersistenceDelegate(ExpressionTypes.class, new EnumDelegate());
       e.setPersistenceDelegate(GroupByDesc.Mode.class, new EnumDelegate());
+      e.setPersistenceDelegate(java.sql.Date.class, new DatePersistenceDelegate());
+      e.setPersistenceDelegate(Timestamp.class, new TimestampPersistenceDelegate());
       e.writeObject(w);
     } finally {
       if (null != e) {
@@ -573,6 +618,8 @@ public final class Utilities {
       // workaround for java 1.5
       e.setPersistenceDelegate(ExpressionTypes.class, new EnumDelegate());
       e.setPersistenceDelegate(GroupByDesc.Mode.class, new EnumDelegate());
+      e.setPersistenceDelegate(java.sql.Date.class, new DatePersistenceDelegate());
+      e.setPersistenceDelegate(Timestamp.class, new TimestampPersistenceDelegate());
       e.writeObject(w);
     } finally {
       if (null != e) {

Modified: hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestUtilities.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestUtilities.java?rev=1506810&r1=1506809&r2=1506810&view=diff
==============================================================================
--- hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestUtilities.java (original)
+++ hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/exec/TestUtilities.java Thu Jul 25 02:39:31 2013
@@ -18,11 +18,18 @@
 
 package org.apache.hadoop.hive.ql.exec;
 
+import java.sql.Date;
+import java.sql.Timestamp;
+
 import static org.apache.hadoop.hive.ql.exec.Utilities.getFileExtension;
 
 import junit.framework.TestCase;
 
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat;
+import org.apache.hadoop.hive.ql.plan.ExprNodeConstantDesc;
+import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
 import org.apache.hadoop.mapred.JobConf;
 
 public class TestUtilities extends TestCase {
@@ -53,4 +60,14 @@ public class TestUtilities extends TestC
     assertEquals("Custom extension for uncompressed text format", extension,
         getFileExtension(jc, true, new HiveIgnoreKeyTextOutputFormat()));
   }
+
+  public void testSerializeTimestamp() {
+    Timestamp ts = new Timestamp(1374554702000L);
+    ts.setNanos(123456);
+    ExprNodeConstantDesc constant = new ExprNodeConstantDesc(
+        TypeInfoFactory.timestampTypeInfo, ts);
+    String serialized = Utilities.serializeExpression(constant);
+    ExprNodeDesc deserialized = Utilities.deserializeExpression(serialized, new Configuration());
+    assertEquals(constant.getExprString(), deserialized.getExprString());
+  }
 }