Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Jira
serverASF JIRA
serverId5aa69414-a9e9-3523-82ec-879b028fb15b
keyIOTDB-944

UDTF管理

装载

UDTF通过反射技术装载

CREATE FUNCTION function_name AS class_name;

卸载

DROP FUNCTION function_name;

展示

SHOW FUNCTIONS;

管理器

装载卸载管理:代码见org.apache.iotdb.db.query.udf.service.UDFRegistrationService

临时文件管理:代码见org.apache.iotdb.db.query.udf.service.TemporaryQueryDataFileService


用户接口设计

所有提供给用户编程的接口/类都在包 org.apache.iotdb.db.query.udf.api 中。所有的接口/类都添加了详细的Javadoc,可以选择从UDTF类开始阅读了解。

...

transform方法是UDTF的核心方法,它的作用是对原始数据进行变换。它有两种签名,一种是UDTF#transform(Row, PointCollector),一种是UDTF#transform(RowWindow, PointCollector),每一种签名的第一个参数为原始数据的输入参数,第二个参数为变换后数据的输出参数。当用户在UDTFConfigurations中将访问原始数据的策略配置为逐行读取时,第一种签名的方法就会被调用。当用户将原始数据的访问策略配置为按滑动时间窗口读取或者固定数据行数的窗口读取时,第二种签名的方法就会被调用。根据原始数据划分的行数或者窗口数量,transform方法将被多次调用,每次调用都允许用户生成任意数量的数据点。


查询计划生成

有三点是需要关注的。

其一,由于允许原始数据查询与UDTF查询混合进行,所以需要修改原先逻辑计划和物理计划的生成方式。基本的做法是引入了UDFContext这一数据结构。相关文件可见SelectOperator、UDFPlan和LogicalGenerator、PhysicalGenerator。

...

其三,UDTF查询列去重的逻辑。注意udf(a, b)和udf(b, a)不同,udf(a, b)和udf(a, b, 'k'='v')不同。代码逻辑主要在PhysicalGenerator#deduplicate中。


求值架构与过程

UDTF的求值采用了如上图所示的3层架构:OutputLayer、TransformerLayer和InputLayer。

求值的基本思想是按需惰性求值:当输出层需要输出新的RowRecord时,Transformer层会首先消耗缓存的先前一次tranform执行生成的数据点,当缓存数据点全部被消耗,才执行新的一批数据的transform,这时才可能要求原始查询层输出下一个RowRecord。

InputLayer

InputLayer由原始查询的输出层RawQueryDataSetWithValueFilter或者RawQueryDataSetWithoutValueFilter,以及一个缓存队列ElasticSerializableRowRecordList组成。

...

代码见包org.apache.iotdb.db.query.udf.core.input。

TransformerLayer

TransformerLayer是架设在InputLayer和OutputLayer之间的中间层,它的作用是:直接传递或者变换InputLayer中的一列或者多列原始数据,产生一列新的时间序列,并对外提供一个统一的列式读取接口,使得OutputLayer能够按列读取新的时间序列,方便生成新的DataSet。

...

代码见包org.apache.iotdb.db.query.udf.core.transfomrer。

OutputLayer

作用是列式读取TransformerLayer的数据,并拼接UDTF查询的结果集。

...

代码见org.apache.iotdb.db.query.dataset.UDTFDataSet及其子类。

One More Thing

可以基于这种求值模式进行扩展,支持UDTF复合函数求值:每一个UDTF单元都对应一个transformer,然后对transform的执行时机进行拓扑排序,构建tranformer的执行pipeline……然后下推求值。


内存管理

在整个UDTF的求值过程中,有3处地方需要进行内存管理:

...