Hive UDF 返回一个调用两次的数组 - 性能?

Hive UDF returning an array called twice - performance?

我在配置单元中创建了一个 GenericUDF,它接受一个字符串参数和 returns 两个字符串的数组,例如:

> select normalise("ABC-123");
...
> [ "abc-123", "abc123" ]

UDF 通过 JNI 为每一行调用 C++ 程序以计算 return 数据,因此出于性能原因,最好只对每个输入行进行一次调用。

但是,我希望能够从数组中获取每个值并将其放入输出中的单独字段 table。我知道我能做到:

> select normalise("ABC-123")[0] as first_string, normalise("ABC-123")[1] as second_string;

hive 是否会调用 normalize 函数两次 - 每次在此语句中使用一次 - 或者它会看到两次调用具有相同的参数并且只调用一次,缓存输出,并使用缓存而不是第二次拨打电话?

如果要每行调用两个 UDF,还有哪些其他选项可以使用此 UDF 并将输出数组中的两个字符串放入输出 table 中的单独列中? (我认为 INLINE 在这里不起作用)

此函数的用例类似于:

a|b
1|ABC-123
2|DEF-456

select a, normalise(b)[0] as first_string, normalise(b)[1] as second_string;

如果你想确保udf只被调用一次,你可以先将结果保存到一个临时的table:

create table tmp as 
select a, normalize(b) arr
from mytable;


select a, arr[0] first_string, arr[1] second_string
from tmp;

就是说,如果我是你,我可能不会担心这种性能调优,在我看来,最好以更多 "brute force" 的心态来处理 Hive:只需编写最简单的代码完成您的任务,如果它很慢,您可以随时向集群添加更多节点。

此外,您是否真的需要自定义 UDF 来完成您的任务,或者您是否可以通过使用内置的 Hive 函数来简化您的代码库,这可能是值得考虑的;在你给出的例子中:

select lower(b) as first_string, regexp_replace(lower(b), '-', '') as second_string