【发布时间】:2015-06-22 13:40:20
【问题描述】:
我在 hive 中创建了一个 GenericUDF,它接受一个字符串参数并返回一个包含两个字符串的数组,类似于:
> select normalise("ABC-123");
...
> [ "abc-123", "abc123" ]
UDF 通过 JNI 调用 C++ 程序,为每一行计算返回数据,因此出于性能原因,最好只对每个输入行调用一次。
但是,我希望能够从数组中获取每个值并将其放入输出表中的单独字段中。我知道我能做到:
> select normalise("ABC-123")[0] as first_string, normalise("ABC-123")[1] as second_string;
hive 将调用 normalize 函数两次 - 每次在此语句中使用一次 - 还是会看到两个调用具有相同的参数并且只调用一次,缓存输出,并使用缓存而不是使第二次打电话?
如果要每行调用两个 UDF,还有哪些其他选项可以使用此 UDF 并将输出数组中的两个字符串放入输出表中的单独列中? (我认为 INLINE 不会在这里工作)
这个函数的用例类似于:
a|b
1|ABC-123
2|DEF-456
select a, normalise(b)[0] as first_string, normalise(b)[1] as second_string;
【问题讨论】: