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, ...)
  • 指定输入:用户可以指定以何种方式对原始数据进行迭代处理


获取原始输入数据的需求

输入的时间序列数量

  • 一个UDTF应该支持任意多个时间序列作为参数输入

场景:多维数据求和。多维数据求平均。

select add(a, b, c, d) from root.sg.d;
  • 一个UDTF应该支持*作为参数输入

场景:每个device下可能有多个温度数据,需要一次分析输出所有温度数据的平均结果。

select average(*) from root.sg.d;

原始输入数据的预处理需求

  • 对于多列时间序列输入的情况,需要先对原始数据的结果按照时间对齐后再递送给用户
  • 用户可能想要一行一行地处理原始数据,对原始数据进行变形

场景:简单的对所有列进行数值计算,求和、求平均、求方差

  • 用户可能想要一个窗口一个窗口地处理原始数据,对原始数据进行变形

场景:降采样查询

  • 原始数据的窗口可能是size-based的或者是time-based的,即固定窗口行数量或者固定窗口时间范围的

场景:降采样查询的窗口有size-based和time-based的

  • 用户在利用窗口对原始数据进行处理时,可以选择使用迭代器进行访问或者利用下标在窗口内进行随机访问

场景:用户在进行窗口计算时,不一定都是按照迭代器的模式进行。例如步长不为1的情况,例如需要从窗口最后一个值计算到第一个值的情况,例如一次计算需要使用到窗口中某个点前后几个点的情况。


对结果数据进行输出的需求

  • UDTF的输出结果是一个时间序列
  • 用户输出应该是(时间戳,值)的时序点对
  • 在UDTF处理的每轮迭代中,用户可以选择输出任意多个数据点对
场景:窗口内异常值检测。一个窗口中的异常值可能不止一个。


与其他查询联合使用的需求

  • 需要允许多个UDTF查询在一个SQL中同时进行

场景:需要在一次查询中看到不同原始数据组合处理后的结果

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


  • No labels