Index: ql/src/test/results/clientpositive/udf_sort_array.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_sort_array.q.out (revision 1349712) +++ ql/src/test/results/clientpositive/udf_sort_array.q.out (working copy) @@ -99,3 +99,29 @@ POSTHOOK: Input: default@src #### A masked pattern was here #### [-3.445,0.777,1.0,1.325,2.003,2.333,9.0] +PREHOOK: query: -- Test it against data in a table. +CREATE TABLE dest1 (value ARRAY) STORED AS TEXTFILE +PREHOOK: type: CREATETABLE +POSTHOOK: query: -- Test it against data in a table. +CREATE TABLE dest1 (value ARRAY) STORED AS TEXTFILE +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@dest1 +PREHOOK: query: INSERT OVERWRITE TABLE dest1 SELECT array(5,4,3,2,1) FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: default@dest1 +POSTHOOK: query: INSERT OVERWRITE TABLE dest1 SELECT array(5,4,3,2,1) FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: default@dest1 +POSTHOOK: Lineage: dest1.value EXPRESSION [] +PREHOOK: query: SELECT sort_array(value) FROM dest1 +PREHOOK: type: QUERY +PREHOOK: Input: default@dest1 +#### A masked pattern was here #### +POSTHOOK: query: SELECT sort_array(value) FROM dest1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@dest1 +#### A masked pattern was here #### +POSTHOOK: Lineage: dest1.value EXPRESSION [] +[1,2,3,4,5] Index: ql/src/test/queries/clientpositive/udf_sort_array.q =================================================================== --- ql/src/test/queries/clientpositive/udf_sort_array.q (revision 1349712) +++ ql/src/test/queries/clientpositive/udf_sort_array.q (working copy) @@ -17,3 +17,9 @@ -- Evaluate function against FLOAT valued keys SELECT sort_array(sort_array(array(2.333, 9, 1.325, 2.003, 0.777, -3.445, 1))) FROM src LIMIT 1; +-- Test it against data in a table. +CREATE TABLE dest1 (value ARRAY) STORED AS TEXTFILE; + +INSERT OVERWRITE TABLE dest1 SELECT array(5,4,3,2,1) FROM src LIMIT 1; + +SELECT sort_array(value) FROM dest1; Index: ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFSortArray.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFSortArray.java (revision 1349712) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFSortArray.java (working copy) @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDFArgumentException; @@ -29,13 +30,11 @@ import org.apache.hadoop.hive.serde.Constants; import org.apache.hadoop.hive.serde2.objectinspector.ListObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters; -import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.Converter; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory; -import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector; -import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.Converter; -import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; -import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils; /** * Generic UDF for array sort @@ -52,7 +51,7 @@ + " 'a', 'b', 'c', 'd'") public class GenericUDFSortArray extends GenericUDF { private Converter[] converters; - private ArrayList ret = new ArrayList(); + private final ArrayList ret = new ArrayList(); private ObjectInspector[] argumentOIs; @Override @@ -68,8 +67,9 @@ switch(arguments[0].getCategory()) { case LIST: if(((ListObjectInspector)(arguments[0])).getListElementObjectInspector() - .getCategory().equals(Category.PRIMITIVE)) + .getCategory().equals(Category.PRIMITIVE)) { break; + } default: throw new UDFArgumentTypeException(0, "Argument 1" + " of function SORT_ARRAY must be " + Constants.LIST_TYPE_NAME @@ -99,8 +99,15 @@ Object array = arguments[0].get(); ListObjectInspector arrayOI = (ListObjectInspector) argumentOIs[0]; ArrayList retArray = (ArrayList) arrayOI.getList(array); - Collections.sort(retArray); + final ObjectInspector valInspector = arrayOI.getListElementObjectInspector(); + Collections.sort(retArray, new Comparator() { + @Override + public int compare(Object o1, Object o2) { + return ObjectInspectorUtils.compare(o1, valInspector, o2, valInspector); + } + }); + ret.clear(); for (int i = 0; i < retArray.size(); i++) { ret.add(converters[0].convert(retArray.get(i)));