hive-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jd...@apache.org
Subject svn commit: r1653095 - 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/beelinepositive/ test/results/clientpos...
Date Mon, 19 Jan 2015 19:51:41 GMT
Author: jdere
Date: Mon Jan 19 19:51:40 2015
New Revision: 1653095

URL: http://svn.apache.org/r1653095
Log:
HIVE-9358: Create LAST_DAY UDF (Alexander Pivovarov via Jason Dere)

Added:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLastDay.java
    hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLastDay.java
    hive/trunk/ql/src/test/queries/clientpositive/udf_last_day.q
    hive/trunk/ql/src/test/results/beelinepositive/udf_last_day.q.out
    hive/trunk/ql/src/test/results/clientpositive/udf_last_day.q.out
Modified:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.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=1653095&r1=1653094&r2=1653095&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 Jan 19
19:51:40 2015
@@ -41,9 +41,7 @@ import javax.xml.parsers.DocumentBuilder
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.hadoop.hive.common.type.HiveDecimal;
 import org.apache.hadoop.hive.conf.HiveConf;
-import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
 import org.apache.hadoop.hive.metastore.api.Function;
 import org.apache.hadoop.hive.metastore.api.MetaException;
 import org.apache.hadoop.hive.metastore.api.NoSuchObjectException;
@@ -274,6 +272,7 @@ public final class FunctionRegistry {
     registerUDF("from_unixtime", UDFFromUnixTime.class, false);
     registerGenericUDF("to_date", GenericUDFDate.class);
     registerUDF("weekofyear", UDFWeekOfYear.class, false);
+    registerGenericUDF("last_day", GenericUDFLastDay.class);
 
     registerGenericUDF("date_add", GenericUDFDateAdd.class);
     registerGenericUDF("date_sub", GenericUDFDateSub.class);

Added: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLastDay.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLastDay.java?rev=1653095&view=auto
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLastDay.java (added)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLastDay.java Mon
Jan 19 19:51:40 2015
@@ -0,0 +1,158 @@
+/**
+ * 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 java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.serde2.io.DateWritable;
+import org.apache.hadoop.hive.serde2.io.TimestampWritable;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.Converter;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorConverter.TimestampConverter;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.io.Text;
+
+/**
+ * GenericUDFLastDay.
+ *
+ * Returns the last day of the month which the date belongs to.
+ * The time part of the date will be  ignored.
+ *
+ */
+@Description(name = "last_day",
+    value = "_FUNC_(date) - Returns the last day of the month which the date belongs to.",
+    extended = "date is a string in the format 'yyyy-MM-dd HH:mm:ss' or 'yyyy-MM-dd'."
+        + " The time part of date is ignored.\n"
+        + "Example:\n " + " > SELECT _FUNC_('2009-01-12') FROM src LIMIT 1;\n" + " '2009-01-31'")
+public class GenericUDFLastDay extends GenericUDF {
+  private transient SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+  private transient TimestampConverter timestampConverter;
+  private transient Converter textConverter;
+  private transient Converter dateWritableConverter;
+  private transient PrimitiveCategory inputType1;
+  private final Calendar calendar = Calendar.getInstance();
+  private final Text output = new Text();
+
+  @Override
+  public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException
{
+    if (arguments.length != 1) {
+      throw new UDFArgumentLengthException("last_day() requires 1 argument, got "
+          + arguments.length);
+    }
+    if (arguments[0].getCategory() != ObjectInspector.Category.PRIMITIVE) {
+      throw new UDFArgumentTypeException(0, "Only primitive type arguments are accepted but
"
+          + arguments[0].getTypeName() + " is passed. as first arguments");
+    }
+    inputType1 = ((PrimitiveObjectInspector) arguments[0]).getPrimitiveCategory();
+    ObjectInspector outputOI = PrimitiveObjectInspectorFactory.writableStringObjectInspector;
+    switch (inputType1) {
+    case STRING:
+    case VARCHAR:
+    case CHAR:
+      inputType1 = PrimitiveCategory.STRING;
+      textConverter = ObjectInspectorConverters.getConverter(
+          (PrimitiveObjectInspector) arguments[0],
+          PrimitiveObjectInspectorFactory.writableStringObjectInspector);
+      break;
+    case TIMESTAMP:
+      timestampConverter = new TimestampConverter((PrimitiveObjectInspector) arguments[0],
+          PrimitiveObjectInspectorFactory.writableTimestampObjectInspector);
+      break;
+    case DATE:
+      dateWritableConverter = ObjectInspectorConverters.getConverter(
+          (PrimitiveObjectInspector) arguments[0],
+          PrimitiveObjectInspectorFactory.writableDateObjectInspector);
+      break;
+    default:
+      throw new UDFArgumentException(
+          " LAST_DAY() only takes STRING/TIMESTAMP/DATEWRITABLE types as first argument,
got "
+              + inputType1);
+    }
+    return outputOI;
+  }
+
+  @Override
+  public Object evaluate(DeferredObject[] arguments) throws HiveException {
+    if (arguments[0].get() == null) {
+      return null;
+    }
+    Date date;
+    switch (inputType1) {
+    case STRING:
+      String dateString = textConverter.convert(arguments[0].get()).toString();
+      try {
+        date = formatter.parse(dateString.toString());
+      } catch (ParseException e) {
+        return null;
+      }
+      lastDay(date);
+      break;
+    case TIMESTAMP:
+      Timestamp ts = ((TimestampWritable) timestampConverter.convert(arguments[0].get()))
+          .getTimestamp();
+      date = ts;
+      lastDay(date);
+      break;
+    case DATE:
+      DateWritable dw = (DateWritable) dateWritableConverter.convert(arguments[0].get());
+      date = dw.get();
+      lastDay(date);
+      break;
+    default:
+      throw new UDFArgumentException(
+          "LAST_DAY() only takes STRING/TIMESTAMP/DATEWRITABLE types, got " + inputType1);
+    }
+    Date newDate = calendar.getTime();
+    output.set(formatter.format(newDate));
+    return output;
+  }
+
+  @Override
+  public String getDisplayString(String[] children) {
+    StringBuilder sb = new StringBuilder();
+    sb.append("last_day(");
+    if (children.length > 0) {
+      sb.append(children[0]);
+      for (int i = 1; i < children.length; i++) {
+        sb.append(", ");
+        sb.append(children[i]);
+      }
+    }
+    sb.append(")");
+    return sb.toString();
+  }
+
+  protected Calendar lastDay(Date d) {
+    calendar.setTime(d);
+    int maxDd = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
+    calendar.set(Calendar.DAY_OF_MONTH, maxDd);
+    return calendar;
+  }
+}

Added: hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLastDay.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLastDay.java?rev=1653095&view=auto
==============================================================================
--- hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLastDay.java
(added)
+++ hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLastDay.java
Mon Jan 19 19:51:40 2015
@@ -0,0 +1,64 @@
+/**
+ * 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 org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
+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.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.io.Text;
+
+import junit.framework.TestCase;
+
+public class TestGenericUDFLastDay extends TestCase {
+
+  public void testLastDay() throws HiveException {
+    GenericUDFLastDay udf = new GenericUDFLastDay();
+    ObjectInspector valueOI0 = PrimitiveObjectInspectorFactory.writableStringObjectInspector;
+    ObjectInspector[] arguments = { valueOI0 };
+
+    udf.initialize(arguments);
+    runAndVerify("2014-01-01", "2014-01-31", udf);
+    runAndVerify("2014-01-14", "2014-01-31", udf);
+    runAndVerify("2014-01-31", "2014-01-31", udf);
+    runAndVerify("2014-02-02", "2014-02-28", udf);
+    runAndVerify("2014-02-28", "2014-02-28", udf);
+    runAndVerify("2016-02-03", "2016-02-29", udf);
+    runAndVerify("2016-02-28", "2016-02-29", udf);
+    runAndVerify("2016-02-29", "2016-02-29", udf);
+
+    runAndVerify("2014-01-01 10:30:45", "2014-01-31", udf);
+    runAndVerify("2014-01-14 10:30:45", "2014-01-31", udf);
+    runAndVerify("2014-01-31 10:30:45", "2014-01-31", udf);
+    runAndVerify("2014-02-02 10:30:45", "2014-02-28", udf);
+    runAndVerify("2014-02-28 10:30:45", "2014-02-28", udf);
+    runAndVerify("2016-02-03 10:30:45", "2016-02-29", udf);
+    runAndVerify("2016-02-28 10:30:45", "2016-02-29", udf);
+    runAndVerify("2016-02-29 10:30:45", "2016-02-29", udf);
+  }
+
+  private void runAndVerify(String str, String expResult, GenericUDF udf)
+      throws HiveException {
+    DeferredObject valueObj0 = new DeferredJavaObject(new Text(str));
+    DeferredObject[] args = { valueObj0 };
+    Text output = (Text) udf.evaluate(args);
+    assertEquals("last_day() test ", expResult, output.toString());
+  }
+}

Added: hive/trunk/ql/src/test/queries/clientpositive/udf_last_day.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/udf_last_day.q?rev=1653095&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/udf_last_day.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/udf_last_day.q Mon Jan 19 19:51:40 2015
@@ -0,0 +1,2 @@
+DESCRIBE FUNCTION last_day;
+DESCRIBE FUNCTION EXTENDED last_day;

Added: hive/trunk/ql/src/test/results/beelinepositive/udf_last_day.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/beelinepositive/udf_last_day.q.out?rev=1653095&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/beelinepositive/udf_last_day.q.out (added)
+++ hive/trunk/ql/src/test/results/beelinepositive/udf_last_day.q.out Mon Jan 19 19:51:40
2015
@@ -0,0 +1,15 @@
+Saving all output to "!!{outputDirectory}!!/udf_last_day.q.raw". Enter "record" with no arguments
to stop it.
+>>>  !run !!{qFileDirectory}!!/udf_last_day.q
+>>>  DESCRIBE FUNCTION last_day;
+'tab_name'
+'last_day(date) - Returns the last day of the month which the date belongs to.'
+1 row selected 
+>>>  DESCRIBE FUNCTION EXTENDED last_day;
+'tab_name'
+'date_add(start_date, num_months) - Returns the last day of the month which the date belongs
to.'
+'date is a string in the format 'yyyy-MM-dd HH:mm:ss' or 'yyyy-MM-dd'. num_months is a number.
The time part of date is ignored.'
+'Example:'
+'   > SELECT last_day('2009-01-12') FROM src LIMIT 1;'
+'  '2009-01-31''
+5 rows selected 
+>>>  !record

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=1653095&r1=1653094&r2=1653095&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 Jan 19 19:51:40
2015
@@ -95,6 +95,7 @@ isnull
 java_method
 json_tuple
 lag
+last_day
 last_value
 lcase
 lead

Added: hive/trunk/ql/src/test/results/clientpositive/udf_last_day.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/udf_last_day.q.out?rev=1653095&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/udf_last_day.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/udf_last_day.q.out Mon Jan 19 19:51:40 2015
@@ -0,0 +1,14 @@
+PREHOOK: query: DESCRIBE FUNCTION last_day
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION last_day
+POSTHOOK: type: DESCFUNCTION
+last_day(date) - Returns the last day of the month which the date belongs to.
+PREHOOK: query: DESCRIBE FUNCTION EXTENDED last_day
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION EXTENDED last_day
+POSTHOOK: type: DESCFUNCTION
+last_day(date) - Returns the last day of the month which the date belongs to.
+date is a string in the format 'yyyy-MM-dd HH:mm:ss' or 'yyyy-MM-dd'. The time part of date
is ignored.
+Example:
+  > SELECT last_day('2009-01-12') FROM src LIMIT 1;
+ '2009-01-31'



Mime
View raw message