我创建了一个udf函数,它接受两个文本参数并返回arraylist。但是当我在hive中调用udf函数时,它给了我一个错误。
以下是我的自定义项代码片段:
public class MyTestUDF extends UDF {
public ArrayList<String> evaluate(Text i, Text s) {
if(s == null) return null;
String id = i.toString();
String value = s.toString();
<parse string value to v1, v2, and v3, and apply logic>
ArrayList<String> result = new ArrayList<String>();
result.add(id);
result.add(v1);
result.add(v2);
result.add(v3);
return result;
}
}
下面是我在 hive 里跑步的过程:
hive> SELECT multi[0] AS id,
multi[1] AS value1,
multi[2] AS value2,
multi[3] AS value3
FROM (SELECT my_udf_function(id, data) AS multi FROM testDB) bar;
FAILED: SemanticException [Error 10033]: Line 1:7 [] not valid on
non-collection types '0': struct<elementdata:struct<>,size:int>
数据是一个巨大的字符串值,我解析并应用逻辑并返回三个值作为arraylist的格式。
我引用了这个返回的链接&使用一个hiveudf中的多个值,但它对我不起作用。
有人能帮忙吗?
谢谢!
1条答案
按热度按时间lawou6xi1#
改变
ArrayList<String>
至ArrayList<Text>
,因为配置单元需要可序列化的类型,例如FloatWritable
,IntWritable
,或Text
. 关于更多信息,我建议返回并使用hiveudf中的多个值,这些值很容易阅读并解释之后要做什么。