03-21-2017 01:21 PM - edited 03-21-2017 01:22 PM
My C++ library containing my UDF has a function that must be called once when the library is loaded and once when it is unloaded. I thought I would put this into the PREPARE_FN and CLOSE_FN but those are not implemented according to the error message I recieve from the CREATE AGGREGATE FUNCTION statement. So, I've put them into the INIT_FN and FINALIZE_FN. Are these guaranteed to be called only once per process?
When will the PREPAERE_FN/CLOSE_FN be implemented?
I'm using 5.8 as version 5.9 has a linking problem related to std c++11 and noexcept.
03-21-2017 04:14 PM
Init() is called at least once per aggregated value (maybe more if values are computed on different nodes then merged later). Finalize() is called once per output aggregate value. This seems like a case where Prepare() and Close() would be useful in a UDA.
I would avoid making any assumptions about when the library is loaded or unloaded since it may be cached (e.g. if multiple queries are using the UDF)
03-22-2017 11:47 AM
Thanks for your reply! My shared library depends on a third-party shared library. In my library, I need to ensure that I call an init() function in the third-party shared library only one time and then call a fini() function only once. Is this possible with an Impala UDF? I've tried using the Linux __attribute__ ((constructor))/destuctor mechanism but then impala hangs when trying to create the function.