我在hive中创建了一个GenericUDF,它接受一个字符串参数并返回一个包含两个字符串的数组,如:
# GEOarchive matrix file.
ID_REF 1688628068_A.AVG_Signal 1688628068_A.Avg_NBEADS 1688628068_A.BEAD_STDERR 1688628068_A.Detection Pval
ILMN_1343291 62821.84 135 413.9399 0
ILMN_1343292 3255.167 131 47.76587 0
ILMN_1343293 42924.91 152 539.3026 0
ILMN_1343294 55255.21 100 746.1457 0
UDF通过JNI调用每行的C ++程序来计算返回数据,因此出于性能原因,最好只需要为每个输入行调用一次。
但是,我希望能够从数组中获取每个值并将其放入输出表中的单独字段中。我知道我能做到:
> select normalise("ABC-123");
...
> [ "abc-123", "abc123" ]
hive会调用normalize函数两次 - 每次在此语句中使用一次 - 或者它会看到两个调用具有相同的参数并且只调用一次,缓存输出,并使用缓存而不是第二次打电话?
如果每行要进行两次UDF调用,还有哪些其他选项可以使用此UDF并将输出数组中的两个字符串放入输出表中的单独列中? (我不认为INLINE会在这里工作)
此功能的用例如下:
> select normalise("ABC-123")[0] as first_string, normalise("ABC-123")[1] as second_string;
答案 0 :(得分:0)
如果要确保只调用一次udf,可以先将结果保存到临时表中:
create table tmp as
select a, normalize(b) arr
from mytable;
select a, arr[0] first_string, arr[1] second_string
from tmp;
那就是说,如果我是你,我可能不会担心这种性能调整,在我看来,Hive最好接近更多的“暴力”状态:只需编写最简单的代码来实现你的任务,如果它很慢,您可以随时向群集中添加更多节点。
此外,您可能值得考虑是否确实需要自定义UDF来完成任务,或者是否可以通过使用内置的Hive功能来简化代码库;在你给出的例子中:
select lower(b) as first_string, regexp_replace(lower(b), '-', '') as second_string