在 HIVE UDF 中返回 ArrayList<String>
Posted
技术标签:
【中文标题】在 HIVE UDF 中返回 ArrayList<String>【英文标题】:Return ArrayList<String> in HIVE UDF 【发布时间】:2017-08-01 20:37:20 【问题描述】:我创建了一个 UDF 函数,它接受两个文本参数并返回 数组列表。 但是当我在 Hive 中调用 UDF 函数时,它给了我一个错误。
这是我的 UDF 代码的 sn-p:
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 的格式返回三个值。
我引用了这个链接Returning & Using Multiple Values from a HIVE UDF,但它对我不起作用。
有人可以帮忙吗?
谢谢!
【问题讨论】:
这看起来不错,对我来说测试也不错。您的my_udf_function
是否有可能通过调用CREATE TEMPORARY FUNCTION
与您的MyTestUDF
不同的类名来别名为其他UDF 类?
【参考方案1】:
将ArrayList<String>
更改为ArrayList<Text>
,因为Hive 需要可序列化的类型,例如FloatWritable
、IntWritable
或Text
。
如需更多信息,我建议Returning & Using Multiple Values from a HIVE UDF,易于阅读并解释之后的操作。
【讨论】:
你能通过“通过 ArrayList 更改 ArrayList”来澄清你的 bean 吗?另外,请尝试always quote the most relevant part of an important link, in case the target site is unreachable or goes permanently offline.(引用自 Stackoverfow 的高质量答案指南)。 好的。我的回答得到了 Markus 和 ryanyuyu 的一些改进。感谢他们。综上所述,'ArrayList以上是关于在 HIVE UDF 中返回 ArrayList<String>的主要内容,如果未能解决你的问题,请参考以下文章
Hive Generic UDF:Hive 未按预期进行转换,原因是:java.lang.ClassCastException:java.util.ArrayList 无法转换为 java.util.