Hive UDF传递数组<string>作为参数

时间:2015-05-25 07:15:55

标签: java arrays hadoop hive user-defined-functions

我正在尝试通过Hive UDF将数组传递给collect_set

SELECT ..., collect_set(...) FROM ...;

我的Hive UDF想要接受这个数组,并将每个数组元素的第一个字母附加到输出字符串:

public class MyUDF extends UDF {

public String evaluate(String[] array) {    
    String output = "";

    // Check for valid argument
    if (array == null) return output;

    try {
        // Add first character of every array element to output string
        for (int i = 0; i < array.length; i++) {
            output += array[i].charAt(0);

            // If there is another array element after this one, append DELIMITER
            if (i + 1 < array.length) output += ",";
        }
    } catch (Exception e) { 
        System.out.println(e.getMessage());
        System.exit(1);
    }
    return output;
}

但是当我尝试运行时遇到的问题:

ADD JAR ./list_builder.jar;
CREATE TEMPORARY FUNCTION build_list as 'MyCustomUDF.MyUDF';

SELECT ..., build_list(collect_set(description)) FROM ...;

...
FAILED: SemanticException [Error 10014]: Line 142:21 Wrong arguments 'description': No matching method for class MyCustomUDF.MyUDF with (array<string>). Possible choices: _FUNC_(struct<>)

我已尝试将String[]更改为ArrayListList,但我仍然遇到同样的错误。

注意collect_set的输出类似于:[L-ADD", "P-OAN", "P-OAH"],所以我期待我的UDF输出如:L,P,P

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:0)

根据@ kostya的回答,我使用了substr

SELECT ..., collect_set(substr(description,0,1)) FROM ...;

这意味着我不需要UDF。

感谢。

答案 1 :(得分:0)

请尝试使用ArrayList<String>而不是String[],因为hive会将数组发送为array<String>而不是String[]

public class MyUDF extends UDF {

public String evaluate(ArrayList<String> array) {    

}