1. 編寫UDF
時序數據庫IoTDB為用戶提供了編寫UDF的JAVA API,用戶可以自主實現UDTF(用戶自定義轉換函數)類,IoTDB將通過類加載機制裝載用戶編寫的類。
Maven依賴
如果使用Maven,可以從Maven庫中搜索以下依賴,并確保依賴版本與目標IoTDB服務器版本相同。以下示例中使用1.0.0版本:
<dependency><groupId>org.apache.iotdb</groupId><artifactId>udf-api</artifactId><version>1.0.0</version><scope>provided</scope>
</dependency>
UDTF接口
在完整的UDTF實例生命周期中,各個方法的調用順序如下:
validate(UDFParameterValidator validator)
:用于檢測用戶輸入的參數是否合法,以及輸入時間序列的數據類型是否符合預期。beforeStart(UDFParameters parameters, UDTFConfigurations configurations)
:必須實現的方法,用于指定UDF訪問原始數據的策略和輸出結果序列的類型。transform(Row row, PointCollector collector)
?或?transform(RowWindow rowWindow, PointCollector collector)
:根據beforeStart
中設置的訪問策略調用,用于處理數據轉換。terminate(PointCollector collector)
:在查詢結束時調用,用于執行必要的清理工作。beforeDestroy()
:在UDF實例銷毀前調用,用于釋放資源。
實現注意事項
- ?validate接口?:用于參數驗證,例如指定輸入時間序列的數量和類型。
- ?beforeStart接口?:設置數據訪問策略和輸出數據類型。
- ?transform接口?:根據訪問策略處理數據。當使用窗口策略時,需特別注意窗口可能為空,以及避免同一時間戳被多次放入
PointCollector
。
2. 注冊UDF
注冊UDF的流程如下:
步驟
- 實現完整的UDF類。
- 將項目打包成JAR文件。
- 根據注冊方式進行準備工作:
- 不指定URI:將JAR包放置到IoTDB服務器的指定目錄(如
iotdb-server-1.0.0-all-bin/ext/udf
,該目錄可配置)。 - 指定URI:將JAR包上傳到服務器并確保IoTDB實例能夠訪問該服務器。
- 不指定URI:將JAR包放置到IoTDB服務器的指定目錄(如
- 使用SQL語法注冊UDF:
CREATE FUNCTION <UDF-NAME> AS <UDF-CLASS-FULL-PATHNAME> (USING URI URI-STRING)?
示例
注冊名為example
的UDF,以下兩種注冊方式任選其一:
- 不指定URI:
CREATE FUNCTION example AS 'org.apache.iotdb.udf.UDTFExample'
- 指定URI:
CREATE FUNCTION example AS 'org.apache.iotdb.udf.UDTFExample' USING URI 'http://jar/example.jar'
注意事項
- 1.0.0版本的IoTDB實例不能注冊0.13及之前版本的UDF JAR包。
- UDF是通過反射技術動態裝載的,無需啟停服務器。
- UDF函數名稱大小寫不敏感,避免與內置函數重名。
- 不同的JAR包中不要有全類名相同但實現邏輯不同的類,以避免SQL執行時行為不一致。