私はいくつかの Hive UDF を作成しており、JNI を使用してネイティブ C ライブラリと通信しています。C ライブラリは、高価な初期化を必要とし、ハンドルを介して内部状態を維持します。行ごとに再初期化するのを避けるために、最初の行でライブラリを初期化し、ハンドルを静的変数として Java ワールドに格納し、それを後続の行にフェッチします。これはすべて正常に機能しています。
難しいのは、ライブラリでは、その内部状態を解放するためにクリーンアップを行う必要があることです。もちろん Java であるため、デストラクタはありません。そして、「ファイナライズ」に頼ることはできません。そのため、このライブラリをクリーンアップする場所がわかりません。
Hive + UDF の世界で、クエリが終了したときに Java コードに通知して、そのライブラリをクリーンアップできるものはありますか? または、これを行うために使用できる Java メカニズムはありますか?
「GenericUDF」ではなく「UDF」クラスを使用していますが、それは問題ではないと思います。クリーンアップのように見えるものはどちらにもありません (GenericUDF の「close」は呼び出されません、AFAICT)。