Index: ql/src/test/results/clientpositive/udf_reverse.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_reverse.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_reverse.q.out (revision 0) @@ -0,0 +1,576 @@ +query: CREATE TABLE dest1(len STRING) +query: EXPLAIN +FROM src INSERT OVERWRITE TABLE dest1 SELECT reverse(src.value) +ABSTRACT SYNTAX TREE: + (TOK_QUERY (TOK_FROM (TOK_TABREF src)) (TOK_INSERT (TOK_DESTINATION (TOK_TAB dest1)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTION reverse (. (TOK_TABLE_OR_COL src) value)))))) + +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-4 depends on stages: Stage-1 + Stage-0 depends on stages: Stage-4 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Alias -> Map Operator Tree: + src + Select Operator + expressions: + expr: reverse(value) + type: string + File Output Operator + compressed: false + GlobalTableId: 1 + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + name: dest1 + + Stage: Stage-4 + Conditional Operator + list of dependent Tasks: + Move Operator + files: + hdfs directory: true + destination: file:/data/users/emil/hive1/hive1/build/ql/tmp/1742168628/10000 + Map Reduce + Alias -> Map Operator Tree: + file:/data/users/emil/hive1/hive1/build/ql/tmp/470690305/10002 + Reduce Output Operator + sort order: + Map-reduce partition columns: + expr: rand() + type: double + tag: -1 + value expressions: + expr: len + type: string + Reduce Operator Tree: + Extract + File Output Operator + compressed: false + GlobalTableId: 0 + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + name: dest1 + + Stage: Stage-0 + Move Operator + tables: + replace: true + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + name: dest1 + + +query: FROM src INSERT OVERWRITE TABLE dest1 SELECT reverse(src.value) +Input: default/src +Output: default/dest1 +query: SELECT dest1.* FROM dest1 +Input: default/dest1 +Output: file:/data/users/emil/hive1/hive1/build/ql/tmp/932829650/10000 +832_lav +68_lav +113_lav +72_lav +561_lav +904_lav +552_lav +872_lav +89_lav +484_lav +562_lav +391_lav +104_lav +051_lav +372_lav +422_lav +963_lav +66_lav +821_lav +312_lav +641_lav +604_lav +924_lav +473_lav +251_lav +964_lav +541_lav +594_lav +73_lav +723_lav +182_lav +772_lav +902_lav +51_lav +28_lav +304_lav +661_lav +714_lav +034_lav +252_lav +292_lav +912_lav +782_lav +351_lav +391_lav +833_lav +644_lav +954_lav +493_lav +732_lav +284_lav +471_lav +314_lav +494_lav +702_lav +991_lav +664_lav +802_lav +471_lav +993_lav +693_lav +742_lav +714_lav +984_lav +261_lav +773_lav +793_lav +903_lav +563_lav +662_lav +934_lav +243_lav +763_lav +523_lav +761_lav +591_lav +574_lav +71_lav +311_lav +551_lav +302_lav +933_lav +0_lav +554_lav +821_lav +113_lav +613_lav +75_lav +203_lav +502_lav +941_lav +834_lav +543_lav +921_lav +071_lav +02_lav +984_lav +751_lav +873_lav +122_lav +29_lav +111_lav +74_lav +27_lav +4_lav +082_lav +53_lav +724_lav +772_lav +802_lav +653_lav +993_lav +961_lav +283_lav +894_lav +521_lav +683_lav +734_lav +964_lav +291_lav +682_lav +781_lav +671_lav +45_lav +954_lav +15_lav +831_lav +301_lav +932_lav +312_lav +612_lav +034_lav +872_lav +671_lav +982_lav +122_lav +56_lav +813_lav +233_lav +113_lav +572_lav +731_lav +142_lav +38_lav +333_lav +081_lav +482_lav +21_lav +032_lav +181_lav +76_lav +062_lav +404_lav +483_lav +984_lav +353_lav +373_lav +272_lav +831_lav +712_lav +48_lav +843_lav +664_lav +85_lav +8_lav +114_lav +032_lav +802_lav +843_lav +42_lav +364_lav +134_lav +971_lav +271_lav +24_lav +921_lav +851_lav +911_lav +694_lav +0_lav +223_lav +791_lav +864_lav +393_lav +454_lav +001_lav +892_lav +991_lav +191_lav +814_lav +69_lav +62_lav +561_lav +723_lav +032_lav +502_lav +021_lav +131_lav +15_lav +404_lav +34_lav +634_lav +651_lav +964_lav +864_lav +803_lav +59_lav +691_lav +882_lav +184_lav +754_lav +89_lav +282_lav +791_lav +781_lav +813_lav +813_lav +904_lav +074_lav +731_lav +963_lav +613_lav +961_lav +314_lav +58_lav +77_lav +0_lav +094_lav +78_lav +463_lav +971_lav +811_lav +431_lav +593_lav +282_lav +831_lav +832_lav +914_lav +51_lav +811_lav +27_lav +09_lav +703_lav +91_lav +534_lav +01_lav +772_lav +372_lav +603_lav +422_lav +903_lav +983_lav +723_lav +242_lav +963_lav +293_lav +272_lav +133_lav +104_lav +242_lav +254_lav +771_lav +622_lav +5_lav +794_lav +204_lav +693_lav +713_lav +593_lav +85_lav +53_lav +633_lav +59_lav +11_lav +861_lav +43_lav +922_lav +332_lav +341_lav +274_lav +223_lav +894_lav +061_lav +591_lav +24_lav +123_lav +034_lav +911_lav +984_lav +854_lav +87_lav +67_lav +14_lav +322_lav +294_lav +941_lav +944_lav +812_lav +822_lav +831_lav +354_lav +03_lav +902_lav +46_lav +864_lav +67_lav +47_lav +243_lav +96_lav +032_lav +33_lav +863_lav +301_lav +692_lav +311_lav +612_lav +763_lav +443_lav +761_lav +472_lav +912_lav +932_lav +584_lav +611_lav +322_lav +652_lav +362_lav +07_lav +784_lav +084_lav +104_lav +882_lav +191_lav +5_lav +442_lav +834_lav +821_lav +764_lav +234_lav +202_lav +613_lav +922_lav +964_lav +364_lav +082_lav +2_lav +53_lav +382_lav +133_lav +532_lav +08_lav +44_lav +391_lav +123_lav +533_lav +401_lav +664_lav +663_lav +571_lav +304_lav +384_lav +35_lav +501_lav +752_lav +604_lav +904_lav +091_lav +604_lav +104_lav +411_lav +852_lav +09_lav +302_lav +262_lav +843_lav +424_lav +21_lav +693_lav +102_lav +712_lav +461_lav +134_lav +454_lav +874_lav +892_lav +521_lav +134_lav +461_lav +424_lav +781_lav +283_lav +5_lav +07_lav +793_lav +084_lav +192_lav +42_lav +153_lav +552_lav +401_lav +07_lav +361_lav +834_lav +911_lav +414_lav +002_lav +194_lav +732_lav +934_lav +063_lav +842_lav +974_lav +503_lav +714_lav +991_lav +444_lav +021_lav +924_lav +961_lav +344_lav +323_lav +523_lav +772_lav +032_lav +874_lav +871_lav +864_lav +013_lav +713_lav +333_lav +394_lav +064_lav +702_lav +942_lav +562_lav +084_lav +38_lav +631_lav +353_lav +271_lav +412_lav +264_lav +332_lav +604_lav +331_lav +571_lav +981_lav +454_lav +573_lav +104_lav +124_lav +704_lav +483_lav +652_lav +62_lav +431_lav +76_lav +483_lav +973_lav +81_lav +264_lav +294_lav +001_lav +892_lav +9_lav +143_lav +894_lav +641_lav +854_lav +263_lav +681_lav +582_lav +843_lav +761_lav +81_lav +372_lav +381_lav +182_lav +443_lav +79_lav +964_lav +513_lav +48_lav +82_lav +73_lav +844_lav +251_lav +843_lav +703_lav +491_lav +414_lav +774_lav +222_lav +621_lav +09_lav +961_lav +304_lav +004_lav +002_lav +79_lav Index: ql/src/test/queries/clientpositive/udf_reverse.q =================================================================== --- ql/src/test/queries/clientpositive/udf_reverse.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_reverse.q (revision 0) @@ -0,0 +1,8 @@ +CREATE TABLE dest1(len STRING); + +EXPLAIN +FROM src INSERT OVERWRITE TABLE dest1 SELECT reverse(src.value); + +FROM src INSERT OVERWRITE TABLE dest1 SELECT reverse(src.value); + +SELECT dest1.* FROM dest1; Index: ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java (revision 792243) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java (working copy) @@ -77,6 +77,7 @@ registerUDF("ltrim", UDFLTrim.class, OperatorType.PREFIX, false); registerUDF("rtrim", UDFRTrim.class, OperatorType.PREFIX, false); registerUDF("length", UDFLength.class, OperatorType.PREFIX, false); + registerUDF("reverse", UDFReverse.class, OperatorType.PREFIX, false); registerUDF("like", UDFLike.class, OperatorType.INFIX, true); registerUDF("rlike", UDFRegExp.class, OperatorType.INFIX, true); Index: ql/src/java/org/apache/hadoop/hive/ql/udf/UDFReverse.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/UDFReverse.java (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/UDFReverse.java (revision 0) @@ -0,0 +1,46 @@ +/** + * 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.UDF; +import org.apache.hadoop.io.Text; + +public class UDFReverse extends UDF { + private Text result = new Text(); + + public Text evaluate(Text s) { + if (s == null) { + return null; + } + + // Use a string because Text.getLength() returns the number of bytes. + // This can be optimized by walking over the utf8 characters and not + // creating a string at all. + String text = s.toString(); + + // Append the text to a StringBuffer in reverse order. + StringBuffer revBuff = new StringBuffer(); + for (int i = text.length() - 1; i >= 0; i--) { + revBuff.append(text.charAt(i)); + } + + result.set(revBuff.toString()); + return result; + } +}