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