【问题标题】:Return ArrayList<String> in HIVE UDF在 HIVE UDF 中返回 ArrayList<String>
【发布时间】: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 类?

标签: java hadoop hive user-defined-functions


【解决方案1】:

ArrayList&lt;String&gt; 更改为ArrayList&lt;Text&gt;,因为Hive 需要可序列化的类型,例如FloatWritableIntWritableText。 如需更多信息,我建议Returning & Using Multiple Values from a HIVE UDF,易于阅读并解释之后的操作。

【讨论】:

猜你喜欢
  • 2013-07-02
  • 1970-01-01
  • 2016-02-22
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
相关资源
最近更新 更多