Index: ql/src/test/results/clientpositive/show_functions.q.out =================================================================== --- ql/src/test/results/clientpositive/show_functions.q.out (revision 2086) +++ ql/src/test/results/clientpositive/show_functions.q.out (working copy) @@ -117,6 +117,7 @@ var_pop var_samp variance +weekofyear when year | Index: ql/src/test/results/clientpositive/udf_weekofyear.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_weekofyear.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_weekofyear.q.out (revision 0) @@ -0,0 +1,28 @@ +PREHOOK: query: DESCRIBE FUNCTION weekofyear +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION weekofyear +POSTHOOK: type: DESCFUNCTION +weekofyear(date) - Returns the week of the year of the given date. A week is considered to start on a Monday and week 1 is the first week with >3 days. +PREHOOK: query: DESCRIBE FUNCTION EXTENDED weekofyear +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED weekofyear +POSTHOOK: type: DESCFUNCTION +weekofyear(date) - Returns the week of the year of the given date. A week is considered to start on a Monday and week 1 is the first week with >3 days. +Examples: + > SELECT weekofyear('2008-02-20') FROM src LIMIT 1; + 8 + > SELECT weekofyear('1980-12-31 12:59:59') FROM src LIMIT 1; + 1 +PREHOOK: query: SELECT weekofyear('1980-01-01'), weekofyear('1980-01-06'), weekofyear('1980-01-07'), weekofyear('1980-12-31'), +weekofyear('1984-1-1'), weekofyear('2008-02-20 00:00:00'), weekofyear('1980-12-28 23:59:59'), weekofyear('1980-12-29 23:59:59') +FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/data/users/pyang/yearweek/trunk/VENDOR.hive/trunk/build/ql/tmp/647339969/10000 +POSTHOOK: query: SELECT weekofyear('1980-01-01'), weekofyear('1980-01-06'), weekofyear('1980-01-07'), weekofyear('1980-12-31'), +weekofyear('1984-1-1'), weekofyear('2008-02-20 00:00:00'), weekofyear('1980-12-28 23:59:59'), weekofyear('1980-12-29 23:59:59') +FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/data/users/pyang/yearweek/trunk/VENDOR.hive/trunk/build/ql/tmp/647339969/10000 +1 1 2 1 52 8 52 1 Index: ql/src/test/queries/clientpositive/udf_weekofyear.q =================================================================== --- ql/src/test/queries/clientpositive/udf_weekofyear.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_weekofyear.q (revision 0) @@ -0,0 +1,7 @@ +DESCRIBE FUNCTION weekofyear; + +DESCRIBE FUNCTION EXTENDED weekofyear; + +SELECT weekofyear('1980-01-01'), weekofyear('1980-01-06'), weekofyear('1980-01-07'), weekofyear('1980-12-31'), +weekofyear('1984-1-1'), weekofyear('2008-02-20 00:00:00'), weekofyear('1980-12-28 23:59:59'), weekofyear('1980-12-29 23:59:59') +FROM src LIMIT 1; Index: ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java (revision 2086) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java (working copy) @@ -128,7 +128,8 @@ registerUDF("from_unixtime", UDFFromUnixTime.class, false); registerUDF("unix_timestamp", UDFUnixTimeStamp.class, false); registerUDF("to_date", UDFDate.class, false); - + registerUDF("weekofyear", UDFWeekOfYear.class, false); + registerUDF("date_add", UDFDateAdd.class, false); registerUDF("date_sub", UDFDateSub.class, false); registerUDF("datediff", UDFDateDiff.class, false); Index: ql/src/java/org/apache/hadoop/hive/ql/udf/UDFWeekOfYear.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/UDFWeekOfYear.java (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/UDFWeekOfYear.java (revision 0) @@ -0,0 +1,76 @@ +/** + * 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 java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.UDF; +import org.apache.hadoop.hive.ql.exec.description; +import org.apache.hadoop.io.IntWritable; +import org.apache.hadoop.io.Text; + +@description( + name = "yearweek", + value = "_FUNC_(date) - Returns the week of the year of the given date. A week " + + "is considered to start on a Monday and week 1 is the first week with >3 days.", + extended = "Examples:\n" + + " > SELECT _FUNC_('2008-02-20') FROM src LIMIT 1;\n" + + " 8\n" + + " > SELECT _FUNC_('1980-12-31 12:59:59') FROM src LIMIT 1;\n" + + " 1" + ) +public class UDFWeekOfYear extends UDF { + + private static Log LOG = LogFactory.getLog(UDFWeekOfYear.class.getName()); + + private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + private Calendar calendar = Calendar.getInstance(); + + IntWritable result = new IntWritable(); + public UDFWeekOfYear() { + calendar.setFirstDayOfWeek(Calendar.MONDAY); + calendar.setMinimalDaysInFirstWeek(4); + } + + /** + * Get the week of the year from a date string. + * + * @param dateString the dateString in the format of "yyyy-MM-dd HH:mm:ss" or "yyyy-MM-dd". + * @return an int from 1 to 53. null if the dateString is not a valid date string. + */ + public IntWritable evaluate(Text dateString) { + if (dateString == null) { + return null; + } + try { + Date date = formatter.parse(dateString.toString()); + calendar.setTime(date); + result.set(calendar.get(Calendar.WEEK_OF_YEAR)); + return result; + } catch (ParseException e) { + return null; + } + } + +}