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));
+ }
+
+}