You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by xu...@apache.org on 2014/02/04 21:42:38 UTC

svn commit: r1564476 - in /hive/trunk/ql/src: java/org/apache/hadoop/hive/ql/udf/ test/org/apache/hadoop/hive/ql/udf/

Author: xuefu
Date: Tue Feb  4 20:42:37 2014
New Revision: 1564476

URL: http://svn.apache.org/r1564476
Log:
HIVE-6327: A few mathematic functions don't take decimal input (reviewed by Jason Dere)

Added:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFMath.java
    hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFMath.java
Modified:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAcos.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAsin.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAtan.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFCos.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFExp.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLn.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLog.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLog10.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLog2.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRadians.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSin.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSqrt.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFTan.java

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAcos.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAcos.java?rev=1564476&r1=1564475&r2=1564476&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAcos.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAcos.java Tue Feb  4 20:42:37 2014
@@ -19,7 +19,6 @@
 package org.apache.hadoop.hive.ql.udf;
 
 import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.ql.exec.UDF;
 import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncACosDoubleToDouble;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncACosLongToDouble;
@@ -34,7 +33,7 @@ import org.apache.hadoop.hive.serde2.io.
     + "  > SELECT _FUNC_(1) FROM src LIMIT 1;\n" + "  0\n"
     + "  > SELECT _FUNC_(2) FROM src LIMIT 1;\n" + "  NULL")
 @VectorizedExpressions({FuncACosLongToDouble.class, FuncACosDoubleToDouble.class})
-public class UDFAcos extends UDF {
+public class UDFAcos extends UDFMath {
   private final DoubleWritable result = new DoubleWritable();
 
   public UDFAcos() {

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAsin.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAsin.java?rev=1564476&r1=1564475&r2=1564476&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAsin.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAsin.java Tue Feb  4 20:42:37 2014
@@ -19,7 +19,6 @@
 package org.apache.hadoop.hive.ql.udf;
 
 import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.ql.exec.UDF;
 import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncASinDoubleToDouble;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncASinLongToDouble;
@@ -36,7 +35,7 @@ import org.apache.hadoop.hive.serde2.io.
     + "  0\n"
     + "  > SELECT _FUNC_(2) FROM src LIMIT 1;\n" + "  NULL")
 @VectorizedExpressions({FuncASinLongToDouble.class, FuncASinDoubleToDouble.class})
-public class UDFAsin extends UDF {
+public class UDFAsin extends UDFMath {
   private final DoubleWritable result = new DoubleWritable();
 
   public UDFAsin() {

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAtan.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAtan.java?rev=1564476&r1=1564475&r2=1564476&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAtan.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFAtan.java Tue Feb  4 20:42:37 2014
@@ -21,7 +21,6 @@ package org.apache.hadoop.hive.ql.udf;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.ql.exec.UDF;
 import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncATanDoubleToDouble;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncATanLongToDouble;
@@ -35,7 +34,7 @@ import org.apache.hadoop.hive.serde2.io.
         "  0"
     )
 @VectorizedExpressions({FuncATanLongToDouble.class, FuncATanDoubleToDouble.class})
-public class UDFAtan extends UDF {
+public class UDFAtan extends UDFMath {
 
   @SuppressWarnings("unused")
   private static Log LOG = LogFactory.getLog(UDFAtan.class.getName());

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFCos.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFCos.java?rev=1564476&r1=1564475&r2=1564476&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFCos.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFCos.java Tue Feb  4 20:42:37 2014
@@ -19,7 +19,6 @@
 package org.apache.hadoop.hive.ql.udf;
 
 import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.ql.exec.UDF;
 import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncCosDoubleToDouble;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncCosLongToDouble;
@@ -34,7 +33,7 @@ import org.apache.hadoop.hive.serde2.io.
     extended = "Example:\n "
     + "  > SELECT _FUNC_(0) FROM src LIMIT 1;\n" + "  1")
 @VectorizedExpressions({FuncCosDoubleToDouble.class, FuncCosLongToDouble.class})
-public class UDFCos extends UDF {
+public class UDFCos extends UDFMath {
   private final DoubleWritable result = new DoubleWritable();
 
   public UDFCos() {

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFExp.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFExp.java?rev=1564476&r1=1564475&r2=1564476&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFExp.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFExp.java Tue Feb  4 20:42:37 2014
@@ -19,7 +19,6 @@
 package org.apache.hadoop.hive.ql.udf;
 
 import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.ql.exec.UDF;
 import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncExpDoubleToDouble;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncExpLongToDouble;
@@ -34,7 +33,7 @@ import org.apache.hadoop.hive.serde2.io.
     extended = "Example:\n "
     + "  > SELECT _FUNC_(0) FROM src LIMIT 1;\n" + "  1")
 @VectorizedExpressions({FuncExpDoubleToDouble.class, FuncExpLongToDouble.class})
-public class UDFExp extends UDF {
+public class UDFExp extends UDFMath {
   private final DoubleWritable result = new DoubleWritable();
 
   public UDFExp() {

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLn.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLn.java?rev=1564476&r1=1564475&r2=1564476&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLn.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLn.java Tue Feb  4 20:42:37 2014
@@ -24,6 +24,7 @@ import org.apache.hadoop.hive.ql.exec.ve
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncLnDoubleToDouble;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncLnLongToDouble;
 import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
 
 /**
  * UDFLn.
@@ -34,7 +35,7 @@ import org.apache.hadoop.hive.serde2.io.
     extended = "Example:\n"
     + "  > SELECT _FUNC_(1) FROM src LIMIT 1;\n" + "  0")
 @VectorizedExpressions({FuncLnLongToDouble.class, FuncLnDoubleToDouble.class})
-public class UDFLn extends UDF {
+public class UDFLn extends UDFMath {
   private final DoubleWritable result = new DoubleWritable();
 
   public UDFLn() {

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLog.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLog.java?rev=1564476&r1=1564475&r2=1564476&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLog.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLog.java Tue Feb  4 20:42:37 2014
@@ -19,13 +19,13 @@
 package org.apache.hadoop.hive.ql.udf;
 
 import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.ql.exec.UDF;
 import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.FuncLogWithBaseDoubleToDouble;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.FuncLogWithBaseLongToDouble;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncLnDoubleToDouble;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncLnLongToDouble;
 import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
 
 /**
  * UDFLog.
@@ -37,7 +37,7 @@ import org.apache.hadoop.hive.serde2.io.
     + "  > SELECT _FUNC_(13, 13) FROM src LIMIT 1;\n" + "  1")
 @VectorizedExpressions({FuncLogWithBaseLongToDouble.class, FuncLogWithBaseDoubleToDouble.class,
   FuncLnLongToDouble.class, FuncLnDoubleToDouble.class})
-public class UDFLog extends UDF {
+public class UDFLog extends UDFMath {
   private final DoubleWritable result = new DoubleWritable();
 
   public UDFLog() {
@@ -59,12 +59,54 @@ public class UDFLog extends UDF {
    * Returns the logarithm of "a" with base "base".
    */
   public DoubleWritable evaluate(DoubleWritable base, DoubleWritable a) {
-    if (a == null || a.get() <= 0.0 || base == null || base.get() <= 1.0) {
+    if (a == null || base == null) {
+      return null;
+    }
+    return log(base.get(), a.get());
+  }
+
+  private DoubleWritable log(double base, double input) {
+    if( base <= 1.0 || input <= 0.0) {
+      return null;
+    }
+    result.set(Math.log(input) / Math.log(base));
+    return result;
+  }
+
+  /**
+   * Get the logarithm of the given decimal with the given base.
+   */
+  public DoubleWritable evaluate(DoubleWritable base, HiveDecimalWritable writable) {
+    if (base == null || writable == null) {
+      return null;
+    }
+    double d = writable.getHiveDecimal().bigDecimalValue().doubleValue();
+    return log(base.get(), d);
+  }
+
+  /**
+   * Get the logarithm of input with the given decimal as the base.
+   */
+  public DoubleWritable evaluate(HiveDecimalWritable base, DoubleWritable d) {
+    if (base == null || d == null) {
       return null;
-    } else {
-      result.set(Math.log(a.get()) / Math.log(base.get()));
-      return result;
     }
+
+    double b = base.getHiveDecimal().bigDecimalValue().doubleValue();
+    return log(b, d.get());
+  }
+
+  /**
+   * Get the logarithm of the given decimal input with the given decimal base.
+   */
+  public DoubleWritable evaluate(HiveDecimalWritable baseWritable, HiveDecimalWritable writable) {
+    if (baseWritable == null || writable == null) {
+      return null;
+    }
+
+    double base = baseWritable.getHiveDecimal().bigDecimalValue().doubleValue();
+    double d = writable.getHiveDecimal().bigDecimalValue().doubleValue();
+    return log(base, d);
   }
 
 }

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLog10.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLog10.java?rev=1564476&r1=1564475&r2=1564476&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLog10.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLog10.java Tue Feb  4 20:42:37 2014
@@ -19,7 +19,6 @@
 package org.apache.hadoop.hive.ql.udf;
 
 import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.ql.exec.UDF;
 import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncLog10DoubleToDouble;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncLog10LongToDouble;
@@ -34,7 +33,7 @@ import org.apache.hadoop.hive.serde2.io.
     extended = "Example:\n"
     + "  > SELECT _FUNC_(10) FROM src LIMIT 1;\n" + "  1")
 @VectorizedExpressions({FuncLog10LongToDouble.class, FuncLog10DoubleToDouble.class})
-public class UDFLog10 extends UDF {
+public class UDFLog10 extends UDFMath {
   private final DoubleWritable result = new DoubleWritable();
 
   public UDFLog10() {
@@ -51,4 +50,5 @@ public class UDFLog10 extends UDF {
       return result;
     }
   }
+
 }

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLog2.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLog2.java?rev=1564476&r1=1564475&r2=1564476&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLog2.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLog2.java Tue Feb  4 20:42:37 2014
@@ -19,7 +19,6 @@
 package org.apache.hadoop.hive.ql.udf;
 
 import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.ql.exec.UDF;
 import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncLog2DoubleToDouble;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncLog2LongToDouble;
@@ -34,7 +33,7 @@ import org.apache.hadoop.hive.serde2.io.
     extended = "Example:\n"
     + "  > SELECT _FUNC_(2) FROM src LIMIT 1;\n" + "  1")
 @VectorizedExpressions({FuncLog2LongToDouble.class, FuncLog2DoubleToDouble.class})
-public class UDFLog2 extends UDF {
+public class UDFLog2 extends UDFMath {
   private static double log2 = Math.log(2.0);
 
   private final DoubleWritable result = new DoubleWritable();

Added: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFMath.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFMath.java?rev=1564476&view=auto
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFMath.java (added)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFMath.java Tue Feb  4 20:42:37 2014
@@ -0,0 +1,49 @@
+/**
+ * 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.hive.ql.udf;
+
+import org.apache.hadoop.hive.ql.exec.UDF;
+import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
+
+public abstract class UDFMath extends UDF {
+  private final DoubleWritable doubleWritable = new DoubleWritable();
+
+  public UDFMath() {
+  }
+
+  /**
+   * For subclass to implement.
+   */
+  public abstract DoubleWritable evaluate(DoubleWritable a);
+
+  /**
+   * Convert HiveDecimal to a double and call evaluate() on it.
+   */
+  public final DoubleWritable evaluate(HiveDecimalWritable writable) {
+    if (writable == null) {
+      return null;
+    }
+
+    double d = writable.getHiveDecimal().bigDecimalValue().doubleValue();
+    doubleWritable.set(d);
+    return evaluate(doubleWritable);
+  }
+
+}

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRadians.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRadians.java?rev=1564476&r1=1564475&r2=1564476&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRadians.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRadians.java Tue Feb  4 20:42:37 2014
@@ -20,13 +20,11 @@ package org.apache.hadoop.hive.ql.udf;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.ql.exec.UDF;
 import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncRadiansDoubleToDouble;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncRadiansLongToDouble;
 import org.apache.hadoop.hive.serde2.io.DoubleWritable;
 
-
 @Description(
       name = "radians",
       value = "_FUNC_(x) - Converts degrees to radians",
@@ -35,7 +33,7 @@ import org.apache.hadoop.hive.serde2.io.
           "  1.5707963267949mo\n"
       )
 @VectorizedExpressions({FuncRadiansLongToDouble.class, FuncRadiansDoubleToDouble.class})
-public class UDFRadians extends UDF {
+public class UDFRadians extends UDFMath {
 
   @SuppressWarnings("unused")
   private static Log LOG = LogFactory.getLog(UDFRadians.class.getName());

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSin.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSin.java?rev=1564476&r1=1564475&r2=1564476&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSin.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSin.java Tue Feb  4 20:42:37 2014
@@ -24,6 +24,7 @@ import org.apache.hadoop.hive.ql.exec.ve
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncSinDoubleToDouble;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncSinLongToDouble;
 import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
 
 /**
  * UDFSin.
@@ -34,7 +35,7 @@ import org.apache.hadoop.hive.serde2.io.
     extended = "Example:\n "
     + "  > SELECT _FUNC_(0) FROM src LIMIT 1;\n" + "  0")
 @VectorizedExpressions({FuncSinLongToDouble.class, FuncSinDoubleToDouble.class})
-public class UDFSin extends UDF {
+public class UDFSin extends UDFMath {
   private final DoubleWritable result = new DoubleWritable();
 
   public UDFSin() {

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSqrt.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSqrt.java?rev=1564476&r1=1564475&r2=1564476&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSqrt.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSqrt.java Tue Feb  4 20:42:37 2014
@@ -19,7 +19,6 @@
 package org.apache.hadoop.hive.ql.udf;
 
 import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.ql.exec.UDF;
 import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncSqrtDoubleToDouble;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncSqrtLongToDouble;
@@ -33,7 +32,7 @@ import org.apache.hadoop.hive.serde2.io.
     extended = "Example:\n "
     + "  > SELECT _FUNC_(4) FROM src LIMIT 1;\n" + "  2")
 @VectorizedExpressions({FuncSqrtLongToDouble.class, FuncSqrtDoubleToDouble.class})
-public class UDFSqrt extends UDF {
+public class UDFSqrt extends UDFMath {
   private final DoubleWritable result = new DoubleWritable();
 
   public UDFSqrt() {

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFTan.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFTan.java?rev=1564476&r1=1564475&r2=1564476&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFTan.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFTan.java Tue Feb  4 20:42:37 2014
@@ -21,7 +21,6 @@ package org.apache.hadoop.hive.ql.udf;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.ql.exec.UDF;
 import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncTanDoubleToDouble;
 import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncTanLongToDouble;
@@ -35,7 +34,7 @@ import org.apache.hadoop.hive.serde2.io.
     		"  1"
     )
 @VectorizedExpressions({FuncTanLongToDouble.class, FuncTanDoubleToDouble.class})
-public class UDFTan extends UDF {
+public class UDFTan extends UDFMath {
 
   @SuppressWarnings("unused")
   private static Log LOG = LogFactory.getLog(UDFTan.class.getName());

Added: hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFMath.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFMath.java?rev=1564476&view=auto
==============================================================================
--- hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFMath.java (added)
+++ hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFMath.java Tue Feb  4 20:42:37 2014
@@ -0,0 +1,150 @@
+/**
+ * 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.hive.ql.udf;
+
+import org.apache.hadoop.hive.common.type.HiveDecimal;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestUDFMath {
+  private HiveDecimalWritable input = null;
+
+  @Test
+  public void testAcos() throws HiveException {
+    UDFAcos udf = new UDFAcos();
+    input = createDecimal("0.716");
+    DoubleWritable res = udf.evaluate(input);
+    Assert.assertEquals(0.7727408115633954, res.get(), 0.000001);
+  }
+
+  @Test
+  public void testAsin() throws HiveException {
+    UDFAsin udf = new UDFAsin();
+    input = createDecimal("0.716");
+    DoubleWritable res = udf.evaluate(input);
+    Assert.assertEquals(0.7980555152315012, res.get(), 0.000001);
+  }
+
+  @Test
+  public void testAtan() throws HiveException {
+    UDFAtan udf = new UDFAtan();
+    input = createDecimal("1.0");
+    DoubleWritable res = udf.evaluate(input);
+    Assert.assertEquals(0.7853981633974483, res.get(), 0.000001);
+  }
+
+  @Test
+  public void testCos() throws HiveException {
+    UDFCos udf = new UDFCos();
+    input = createDecimal("0.7727408115633954");
+    DoubleWritable res = udf.evaluate(input);
+    Assert.assertEquals(0.716, res.get(), 0.000001);
+  }
+
+  @Test
+  public void testSin() throws HiveException {
+    UDFSin udf = new UDFSin();
+    input = createDecimal("0.7980555152315012");
+    DoubleWritable res = udf.evaluate(input);
+    Assert.assertEquals(0.716, res.get(), 0.000001);
+  }
+
+  @Test
+  public void testTan() throws HiveException {
+    UDFTan udf = new UDFTan();
+    input = createDecimal("0.7853981633974483");
+    DoubleWritable res = udf.evaluate(input);
+    Assert.assertEquals(1.0, res.get(), 0.000001);
+  }
+
+  @Test
+  public void testExp() throws HiveException {
+    UDFExp udf = new UDFExp();
+    input = createDecimal("2.0");
+    DoubleWritable res = udf.evaluate(input);
+    Assert.assertEquals(7.38905609893065, res.get(), 0.000001);
+  }
+
+  @Test
+  public void testLn() throws HiveException {
+    UDFLn udf = new UDFLn();
+    input = createDecimal("7.38905609893065");
+    DoubleWritable res = udf.evaluate(input);
+    Assert.assertEquals(2.0, res.get(), 0.000001);
+  }
+
+  @Test
+  public void testLog() throws HiveException {
+    UDFLog udf = new UDFLog();
+    input = createDecimal("7.38905609893065");
+    DoubleWritable res = udf.evaluate(input);
+    Assert.assertEquals(2.0, res.get(), 0.000001);
+    
+    DoubleWritable input = new DoubleWritable(9.0);
+    res = udf.evaluate(createDecimal("3.0"), input);
+    Assert.assertEquals(2.0, res.get(), 0.000001);
+
+    DoubleWritable base = new DoubleWritable(3.0);
+    res = udf.evaluate(base, createDecimal("9.0"));
+    Assert.assertEquals(2.0, res.get(), 0.000001);
+
+    res = udf.evaluate(createDecimal("3.0"), createDecimal("9.0"));
+    Assert.assertEquals(2.0, res.get(), 0.000001);
+}
+
+  @Test
+  public void testLog10() throws HiveException {
+    UDFLog10 udf = new UDFLog10();
+    input = createDecimal("100.0");
+    DoubleWritable res = udf.evaluate(input);
+    Assert.assertEquals(2.0, res.get(), 0.000001);
+  }
+
+  @Test
+  public void testLog2() throws HiveException {
+    UDFLog2 udf = new UDFLog2();
+    input = createDecimal("8.0");
+    DoubleWritable res = udf.evaluate(input);
+    Assert.assertEquals(3.0, res.get(), 0.000001);
+  }
+
+  @Test
+  public void testRadians() throws HiveException {
+    UDFRadians udf = new UDFRadians();
+    input = createDecimal("45.0");
+    DoubleWritable res = udf.evaluate(input);
+    Assert.assertEquals(0.7853981633974483, res.get(), 0.000001);
+  }
+
+  @Test
+  public void testSqrt() throws HiveException {
+    UDFSqrt udf = new UDFSqrt();
+    input = createDecimal("49.0");
+    DoubleWritable res = udf.evaluate(input);
+    Assert.assertEquals(7.0, res.get(), 0.000001);
+  }
+
+  private HiveDecimalWritable createDecimal(String input) {
+    return new HiveDecimalWritable(HiveDecimal.create(input));
+  }
+
+}