Unable to render Jira issues macro, execution error.
UDTF定义
UDTF:User-defined Time-series Generating Function (UDTF)
UDTF允许用户通过编程的方式访问原始的查询数据,允许用户对原始数据进行自由的变形、过滤或扩增,并控制数据最终的输出。一个UDTF的执行将且只将产生一个新的时间序列,对应于查询的一列输出。用户可以通过类似于调用IoTDB内置聚合函数的方式调用UDTF。下面就是一个例子:
select abs(s0) from root.sg1.d0, root.sg1.d1;
上面的UDTF查询会返回2列结果,作用是对原始的查询序列取绝对值。结果中每一列可能会有多行数据(与原始数据行数相同),每一个值都是原始数据值取绝对值之后的结果。
配置UDTF的需求
需要通过某种方式获取用户在SQL中输入的UDTF参数信息,并利用这些参数对UDTF进行基本的设置。
获取用户输入信息的需求
场景:在同一个UDTF中,用户需要针对不同measurement进行不同的数据处理。例如在降频查询中,相比速度数据,温度数据的采样频率可以更低。用户获取到measurement之后可以进行更细粒度的控制,而无需重写一个功能类似的UDTF。
- 用户可以在UDTF的输入参数中自定义KV对形式的属性,用于输入除了时间序列之外的配置信息(为了解析的方便和传入参数的通用性考虑,限定KV都是字符串形式)
场景:用户在指定窗口访问时,需要指定窗口开始时间、结束时间、滑动步长、窗口大小等等信息,UDTF要允许这类外部信息传入。在别的UDTF查询中,可能还有一些用户希望传入自定义的参数,比如降采样查询中的采样精度等。
- 应该提供一种很方便的方式帮助用户解析KV对中的属性(帮助用户进行类型转换等)
场景:当用户传入的参数如降采样查询中的采样精度时,用户实际想拿到的是Double类型的数值而并非String。
对UDTF进行基本配置的需求
- 指定输出:需要能够对UDTF的输出类型进行设定(INT32, INT64, FLOAT, ...)
- 指定输入:用户可以指定以何种方式对原始数据进行迭代处理
获取原始输入数据的需求
输入的时间序列数量
场景:多维数据求和。多维数据求平均。
select add(a, b, c, d) from root.sg.d;
场景:每个device下可能有多个温度数据,需要一次分析输出所有温度数据的平均结果。
select average(*) from root.sg.d;
原始输入数据的预处理需求
- 对于多列时间序列输入的情况,需要先对原始数据的结果按照时间对齐后再递送给用户
- 用户可能想要一行一行地处理原始数据,对原始数据进行变形
场景:简单的对所有列进行数值计算,求和、求平均、求方差
- 用户可能想要一个窗口一个窗口地处理原始数据,对原始数据进行变形
场景:降采样查询
- 原始数据的窗口可能是size-based的或者是time-based的,即固定窗口行数量或者固定窗口时间范围的
场景:降采样查询的窗口有size-based和time-based的
- 用户在利用窗口对原始数据进行处理时,可以选择使用迭代器进行访问或者利用下标在窗口内进行随机访问
场景:用户在进行窗口计算时,不一定都是按照迭代器的模式进行。例如步长不为1的情况,例如需要从窗口最后一个值计算到第一个值的情况,例如一次计算需要使用到窗口中某个点前后几个点的情况。
对结果数据进行输出的需求
- UDTF的输出结果是一个时间序列
- 用户输出应该是(时间戳,值)的时序点对
- 在UDTF处理的每轮迭代中,用户可以选择输出任意多个数据点对
场景:窗口内异常值检测。一个窗口中的异常值可能不止一个。
与其他查询联合使用的需求
场景:需要在一次查询中看到不同原始数据组合处理后的结果
select add(a, b), multiply(a, c) from root.sg.d;
- 需要允许UDTF查询与原始查询在一个SQL中同时进行
场景:同时需要原始数据与变形后的数据
select a, b, add(a, b) from root.sg.d;
非功能性需求
- 当一个时间序列在一个完整查询中担任多个角色时(例如:select a, udf(a), udf(a, b) from root.sg.d),只能生成一个reader来读取时间序列的原始数据,需要避免不必要的I/O
- UDTF查询可能会产生很多中间结果,系统需要保证在进行UDTF查询时不会OOM