diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java index fc0256c..6c4f79c 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java @@ -103,6 +103,7 @@ import org.apache.hadoop.hive.ql.udf.UDFRegExpReplace; import org.apache.hadoop.hive.ql.udf.UDFRepeat; import org.apache.hadoop.hive.ql.udf.UDFReverse; +import org.apache.hadoop.hive.ql.udf.UDFLeftSubstring; import org.apache.hadoop.hive.ql.udf.UDFRound; import org.apache.hadoop.hive.ql.udf.UDFRpad; import org.apache.hadoop.hive.ql.udf.UDFSecond; @@ -301,6 +302,7 @@ registerUDF("rtrim", UDFRTrim.class, false); registerUDF("length", UDFLength.class, false); registerUDF("reverse", UDFReverse.class, false); + registerUDF("lsubstring", UDFLeftSubstring.class, false); registerGenericUDF("field", GenericUDFField.class); registerUDF("find_in_set", UDFFindInSet.class, false); diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLeftSubstring.java ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLeftSubstring.java new file mode 100644 index 0000000..1188bc8 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLeftSubstring.java @@ -0,0 +1,59 @@ +/** + * 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.Description; +import org.apache.hadoop.hive.ql.exec.UDF; +import org.apache.hadoop.io.IntWritable; +import org.apache.hadoop.io.Text; + +/** + * UDFLeftSubstring + * + */ +@Description(name = "lsubstring", + value = "_FUNC_(string,length) - Returns the left most 'length' characters of the given string", + extended = "if any argument is NULL it will return NULL" + + "Example:\n " + + " > SELECT _FUNC_('HADOOP','4') FROM src LIMIT 1;\n" + + "HADO") +public class UDFLeftSubstring extends UDF { + private Text result = new Text(); + + public UDFLeftSubstring() { + } + + /** + * Get the substring from a specified position till end of a given string. + * + * @param String + * Any valid String. + * @return Leftmost specified length of the given string. returns NULL if any argument is NULL. + */ + + public Text evaluate(Text strName, IntWritable b) { + + if (strName == null) { + return null; + } + result.set(strName.toString().substring(0, b.get())); + return result; + } + +} diff --git ql/src/test/queries/clientpositive/udf_left.q ql/src/test/queries/clientpositive/udf_left.q new file mode 100644 index 0000000..0ebe07d --- /dev/null +++ ql/src/test/queries/clientpositive/udf_left.q @@ -0,0 +1,7 @@ +DESCRIBE FUNCTION lsubstring; +DESCRIBE FUNCTION EXTENDED lsubstring; + +EXPLAIN +SELECT lsubstring('HADOOP',4) FROM src LIMIT 1; + +SELECT lsubstring('HADOOP',4) FROM src LIMIT 1; diff --git ql/src/test/results/clientpositive/udf_left.q.out ql/src/test/results/clientpositive/udf_left.q.out new file mode 100644 index 0000000..7f3e7b7 --- /dev/null +++ ql/src/test/results/clientpositive/udf_left.q.out @@ -0,0 +1,60 @@ +PREHOOK: query: DESCRIBE FUNCTION lsubstring +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION lsubstring +POSTHOOK: type: DESCFUNCTION +lsubstring(string,length) - Returns the left most 'length' characters of the given string +PREHOOK: query: DESCRIBE FUNCTION EXTENDED lsubstring +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED lsubstring +POSTHOOK: type: DESCFUNCTION +lsubstring(string,length) - Returns the left most 'length' characters of the given string +if any argument is NULL it will return NULLExample: + > SELECT lsubstring('HADOOP','4') FROM src LIMIT 1; +HADO +PREHOOK: query: EXPLAIN +SELECT lsubstring('HADOOP',4) FROM src LIMIT 1 +PREHOOK: type: QUERY +POSTHOOK: query: EXPLAIN +SELECT lsubstring('HADOOP',4) FROM src LIMIT 1 +POSTHOOK: type: QUERY +ABSTRACT SYNTAX TREE: + (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME src))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTION lsubstring 'HADOOP' 4))) (TOK_LIMIT 1))) + +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Alias -> Map Operator Tree: + src + TableScan + alias: src + Select Operator + expressions: + expr: lsubstring('HADOOP', 4) + type: string + outputColumnNames: _col0 + Limit + File Output Operator + compressed: false + GlobalTableId: 0 + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + + Stage: Stage-0 + Fetch Operator + limit: 1 + + +PREHOOK: query: SELECT lsubstring('HADOOP',4) FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: SELECT lsubstring('HADOOP',4) FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +HADO