UDF样例程序与操作
UDF完整样例程序
可以参考的“IoTDB 自定义函数(UDF)程序”章节。
操作步骤
- UDF注册。
注册一个全类名为“com.huawei.bigdata.iotdb.UDTFExample”的UDF可以按如下流程进行:
- 将项目打成Jar包,如果使用Maven管理项目,可以参考“注册UDF”章节的“构建Jar包”部分。
- 以root用户,登录IoTDBServer所在的节点,执行su - omm命令切换到omm用户,将1.a中的Jar包导入到目录“$BIGDATA_HOME/FusionInsight_IoTDB_*/install/FusionInsight-IoTDB-*/iotdb/ext/udf”下。
在部署集群的时候,需要保证每一个IoTDBserver节点的UDF JAR包路径下都存在相应的Jar包。可以通过修改IoTDB配置“udf_root_dir”来指定UDF加载Jar的根路径。
- 使用SQL语句注册该UDF,语法如下:
CREATE FUNCTION <UDF-NAME> AS '<UDF-CLASS-FULL-PATHNAME>'
例如,注册名称为“example”的UDF命令为:
CREATE FUNCTION example AS 'com.huawei.bigdata.iotdb.UDTFExample'
由于IoTDB的UDF是通过反射技术动态装载的,因此您在装载过程中无需启停服务器。
- UDF函数名称是大小写不敏感的。
- 请不要给UDF函数注册一个内置函数的名字。使用内置函数的名字给UDF注册会失败。
- 不同的JAR包中建议不要有全类名相同但实现功能逻辑不一样的类。例如UDF(UDAF/UDTF):udf1、udf2分别对应资源udf1.jar、udf2.jar。如果两个Jar包里都包含一个“com.huawei.bigdata.iotdb.UDTFExample”类,当同一个SQL中同时使用到这两个UDF时,系统会随机加载其中一个类,导致UDF执行行为不一致。
- UDF查询。
- UDF支持对的基础SQL语法为:
- SLIMIT / SOFFSET
- LIMIT / OFFSET
- NON ALIGN
- 支持值过滤
- 支持时间过滤
- 对齐时间查询。
UDF查询目前不支持对对齐时间序列“(Aligned Timeseries)”进行查询,当在SELECT子句中选择的序列中包含对齐时间序列时,会提示错误。
- 带“*”查询。
假定现在有时间序列“root.sg.d1.s1”和“root.sg.d1.s2”。
- 执行SELECT example(*) from root.sg.d1
那么结果集中将包括“example(root.sg.d1.s1)”和“example(root.sg.d1.s2)”的结果。
- 执行SELECT example(s1, *) from root.sg.d1
那么结果集中将包括“example(root.sg.d1.s1, root.sg.d1.s1)”和“example(root.sg.d1.s1, root.sg.d1.s2)”的结果。
- 执行SELECT example(*, *) from root.sg.d1
那么结果集中将包括“example(root.sg.d1.s1, root.sg.d1.s1)”,“example(root.sg.d1.s2, root.sg.d1.s1)”,“example(root.sg.d1.s1, root.sg.d1.s2)” 和“ example(root.sg.d1.s2, root.sg.d1.s2)”的结果。
- 执行SELECT example(*) from root.sg.d1
- 带自定义参数输入的查询。
您可以在进行UDF查询的时候,向UDF传入任意数量的键值对参数。键值对中的键和值都需要被单引号或者双引号引起来。注意,键值对参数只能在所有时间序列后传入。例如:
SELECT example(s1, 'key1'='value1', 'key2'='value2'), example(*, 'key3'='value3') FROM root.sg.d1; SELECT example(s1, s2, 'key1'='value1', 'key2'='value2') FROM root.sg.d1;
- 查看所有注册的UDF。
- UDF支持对的基础SQL语法为:
- UDF卸载。
卸载UDF的SQL语法如下:
DROP FUNCTION <UDF-NAME>
卸载名称为“example”的UDF的命令为:
DROP FUNCTION example