You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by jd...@apache.org on 2015/03/16 18:36:18 UTC
svn commit: r1667080 - in /hive/trunk/ql/src:
java/org/apache/hadoop/hive/ql/exec/
java/org/apache/hadoop/hive/ql/udf/generic/
test/org/apache/hadoop/hive/ql/udf/generic/ test/queries/clientpositive/
test/results/clientpositive/
Author: jdere
Date: Mon Mar 16 17:36:17 2015
New Revision: 1667080
URL: http://svn.apache.org/r1667080
Log:
HIVE-9858: Create cbrt (cube root) UDF (Alexander Pivovarov via Jason Dere)
Added:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFCbrt.java
hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFCbrt.java
hive/trunk/ql/src/test/queries/clientpositive/udf_cbrt.q
hive/trunk/ql/src/test/results/clientpositive/udf_cbrt.q.out
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDF.java
hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java?rev=1667080&r1=1667079&r2=1667080&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java Mon Mar 16 17:36:17 2015
@@ -188,6 +188,7 @@ public final class FunctionRegistry {
system.registerGenericUDF("round", GenericUDFRound.class);
system.registerGenericUDF("floor", GenericUDFFloor.class);
system.registerUDF("sqrt", UDFSqrt.class, false);
+ system.registerGenericUDF("cbrt", GenericUDFCbrt.class);
system.registerGenericUDF("ceil", GenericUDFCeil.class);
system.registerGenericUDF("ceiling", GenericUDFCeil.class);
system.registerUDF("rand", UDFRand.class, false);
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDF.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDF.java?rev=1667080&r1=1667079&r2=1667080&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDF.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDF.java Mon Mar 16 17:36:17 2015
@@ -33,6 +33,7 @@ import org.apache.hadoop.hive.ql.metadat
import org.apache.hadoop.hive.ql.udf.UDFType;
import org.apache.hadoop.hive.serde2.io.ByteWritable;
import org.apache.hadoop.hive.serde2.io.DateWritable;
+import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.hive.serde2.io.ShortWritable;
import org.apache.hadoop.hive.serde2.io.TimestampWritable;
import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector;
@@ -363,6 +364,17 @@ public abstract class GenericUDF impleme
inputTypes[i] = inputType;
}
+ protected void obtainDoubleConverter(ObjectInspector[] arguments, int i,
+ PrimitiveCategory[] inputTypes, Converter[] converters) throws UDFArgumentTypeException {
+ PrimitiveObjectInspector inOi = (PrimitiveObjectInspector) arguments[i];
+ PrimitiveCategory inputType = inOi.getPrimitiveCategory();
+ Converter converter = ObjectInspectorConverters.getConverter(
+ (PrimitiveObjectInspector) arguments[i],
+ PrimitiveObjectInspectorFactory.writableDoubleObjectInspector);
+ converters[i] = converter;
+ inputTypes[i] = inputType;
+ }
+
protected void obtainDateConverter(ObjectInspector[] arguments, int i,
PrimitiveCategory[] inputTypes, Converter[] converters) throws UDFArgumentTypeException {
PrimitiveObjectInspector inOi = (PrimitiveObjectInspector) arguments[i];
@@ -440,6 +452,17 @@ public abstract class GenericUDF impleme
return v;
}
+ protected Double getDoubleValue(DeferredObject[] arguments, int i, Converter[] converters)
+ throws HiveException {
+ Object obj;
+ if ((obj = arguments[i].get()) == null) {
+ return null;
+ }
+ Object writableValue = converters[i].convert(obj);
+ double v = ((DoubleWritable) writableValue).get();
+ return v;
+ }
+
protected Date getDateValue(DeferredObject[] arguments, int i, PrimitiveCategory[] inputTypes,
Converter[] converters) throws HiveException {
Object obj;
Added: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFCbrt.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFCbrt.java?rev=1667080&view=auto
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFCbrt.java (added)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFCbrt.java Mon Mar 16 17:36:17 2015
@@ -0,0 +1,80 @@
+/**
+ * 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.generic;
+
+import static org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils.PrimitiveGrouping.NUMERIC_GROUP;
+
+import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.Converter;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+
+/**
+ * GenericUDFCbrt.
+ *
+ */
+@Description(
+ name = "cbrt",
+ value = "_FUNC_(double) - Returns the cube root of a double value.",
+ extended = "Example:\n > SELECT _FUNC_(27.0);\n 3.0")
+public class GenericUDFCbrt extends GenericUDF {
+ private transient PrimitiveCategory[] inputTypes = new PrimitiveCategory[1];
+ private transient Converter[] converters = new Converter[1];
+ private final DoubleWritable output = new DoubleWritable();
+
+ @Override
+ public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
+ checkArgsSize(arguments, 1, 1);
+
+ checkArgPrimitive(arguments, 0);
+
+ checkArgGroups(arguments, 0, inputTypes, NUMERIC_GROUP);
+
+ obtainDoubleConverter(arguments, 0, inputTypes, converters);
+
+ ObjectInspector outputOI = PrimitiveObjectInspectorFactory.writableDoubleObjectInspector;
+ return outputOI;
+ }
+
+ @Override
+ public Object evaluate(DeferredObject[] arguments) throws HiveException {
+ Double val = getDoubleValue(arguments, 0, converters);
+ if (val == null) {
+ return null;
+ }
+
+ double cbrt = Math.cbrt(val);
+ output.set(cbrt);
+ return output;
+ }
+
+ @Override
+ public String getDisplayString(String[] children) {
+ return getStandardDisplayString(getFuncName(), children);
+ }
+
+ @Override
+ protected String getFuncName() {
+ return "cbrt";
+ }
+}
\ No newline at end of file
Added: hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFCbrt.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFCbrt.java?rev=1667080&view=auto
==============================================================================
--- hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFCbrt.java (added)
+++ hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFCbrt.java Mon Mar 16 17:36:17 2015
@@ -0,0 +1,58 @@
+/**
+ * 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.generic;
+
+import junit.framework.TestCase;
+
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredJavaObject;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredObject;
+import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+
+public class TestGenericUDFCbrt extends TestCase {
+
+ public void testCbrt() throws HiveException {
+ GenericUDFCbrt udf = new GenericUDFCbrt();
+ ObjectInspector valueOI0 = PrimitiveObjectInspectorFactory.writableDoubleObjectInspector;
+ ObjectInspector[] arguments = { valueOI0 };
+
+ udf.initialize(arguments);
+
+ runAndVerify(0.0, 0.0, udf);
+ runAndVerify(1.0, 1.0, udf);
+ runAndVerify(-1.0, -1.0, udf);
+ runAndVerify(27.0, 3.0, udf);
+ runAndVerify(-27.0, -3.0, udf);
+ runAndVerify(87860583272930481.0, 444561.0, udf);
+ runAndVerify(null, null, udf);
+ }
+
+ private void runAndVerify(Double in, Double expResult, GenericUDF udf) throws HiveException {
+ DeferredObject valueObj0 = new DeferredJavaObject(in != null ? new DoubleWritable(in) : null);
+ DeferredObject[] args = { valueObj0 };
+ DoubleWritable output = (DoubleWritable) udf.evaluate(args);
+ if (expResult == null) {
+ assertNull("cbrt() test", output);
+ } else {
+ assertNotNull("cbrt() test", output);
+ assertEquals("cbrt() test", expResult.doubleValue(), output.get(), 1E-10);
+ }
+ }
+}
Added: hive/trunk/ql/src/test/queries/clientpositive/udf_cbrt.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/udf_cbrt.q?rev=1667080&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/udf_cbrt.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/udf_cbrt.q Mon Mar 16 17:36:17 2015
@@ -0,0 +1,13 @@
+DESCRIBE FUNCTION cbrt;
+DESC FUNCTION EXTENDED cbrt;
+
+explain select cbrt(27.0);
+
+select
+cbrt(0.0),
+cbrt(1.0),
+cbrt(-1),
+cbrt(27),
+cbrt(-27.0),
+cbrt(87860583272930481),
+cbrt(cast(null as double));
\ No newline at end of file
Modified: hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out?rev=1667080&r1=1667079&r2=1667080&view=diff
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out (original)
+++ hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out Mon Mar 16 17:36:17 2015
@@ -34,6 +34,7 @@ base64
between
bin
case
+cbrt
ceil
ceiling
coalesce
@@ -218,6 +219,7 @@ PREHOOK: type: SHOWFUNCTIONS
POSTHOOK: query: SHOW FUNCTIONS '^c.*'
POSTHOOK: type: SHOWFUNCTIONS
case
+cbrt
ceil
ceiling
coalesce
Added: hive/trunk/ql/src/test/results/clientpositive/udf_cbrt.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/udf_cbrt.q.out?rev=1667080&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/udf_cbrt.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/udf_cbrt.q.out Mon Mar 16 17:36:17 2015
@@ -0,0 +1,58 @@
+PREHOOK: query: DESCRIBE FUNCTION cbrt
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION cbrt
+POSTHOOK: type: DESCFUNCTION
+cbrt(double) - Returns the cube root of a double value.
+PREHOOK: query: DESC FUNCTION EXTENDED cbrt
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESC FUNCTION EXTENDED cbrt
+POSTHOOK: type: DESCFUNCTION
+cbrt(double) - Returns the cube root of a double value.
+Example:
+ > SELECT cbrt(27.0);
+ 3.0
+PREHOOK: query: explain select cbrt(27.0)
+PREHOOK: type: QUERY
+POSTHOOK: query: explain select cbrt(27.0)
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+ Stage-0 is a root stage
+
+STAGE PLANS:
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+ Processor Tree:
+ TableScan
+ alias: _dummy_table
+ Row Limit Per Split: 1
+ Statistics: Num rows: 0 Data size: 1 Basic stats: PARTIAL Column stats: COMPLETE
+ Select Operator
+ expressions: 3.0 (type: double)
+ outputColumnNames: _col0
+ Statistics: Num rows: 0 Data size: 1 Basic stats: PARTIAL Column stats: COMPLETE
+ ListSink
+
+PREHOOK: query: select
+cbrt(0.0),
+cbrt(1.0),
+cbrt(-1),
+cbrt(27),
+cbrt(-27.0),
+cbrt(87860583272930481),
+cbrt(cast(null as double))
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+POSTHOOK: query: select
+cbrt(0.0),
+cbrt(1.0),
+cbrt(-1),
+cbrt(27),
+cbrt(-27.0),
+cbrt(87860583272930481),
+cbrt(cast(null as double))
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+#### A masked pattern was here ####
+0.0 1.0 -1.0 3.0 -3.0 444561.0 NULL