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

时间:2015-06-22 05:29:16

标签: hive hiveql

我在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;

1 个答案:

答案 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