在 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&lt;String&gt; 更改为ArrayList&lt;Text&gt;,因为Hive 需要可序列化的类型,例如FloatWritableIntWritableText。 如需更多信息,我建议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 理解。它需要另一种类型 serializable,在这种情况下,'ArrayList' 是完美的。

以上是关于在 HIVE UDF 中返回 ArrayList<String>的主要内容,如果未能解决你的问题,请参考以下文章

Hive Generic UDF:Hive 未按预期进行转换,原因是:java.lang.ClassCastException:java.util.ArrayList 无法转换为 java.util.

自动增量 UDF 在 hive 中工作,但在 Impala 中返回 null

Hive UDF 不返回预期结果

hive之udf函数的使用

Hive UDF 返回多列输出

[Hive]Hive自定义函数UDF