白皮书
车联网设计与实现:搭建可靠、高效、符合行业需求的车联网平台 →

eKuiper Newsletter 2022-02 | 新增变化检测函数、重构共用连接

eKuiper Team
2022-2-26
eKuiper Newsletter 2022-02 | 新增变化检测函数、重构共用连接

目前 eKuiper 处于 1.5.0 版本的开发周期中。本月我们主要实现了一个通用的变化检测函数,以满足很多用户提出的仅采集变化数据的需求。同时我们也在进行 1.4.3 版本的开发,解决了共用连接的订阅导致的问题以及其他用户反馈问题。

变化检测函数

通用的变化检测函数 changed_cols 已开发完成,并合并到 1.5.0 版本的分支中。changed_cols 函数的作用是检测指定的列是否发生变化,如果发生变化,则返回变化的列的值,否则不返回。在变化检测的场景中,用户经常需要监测多个列/表达式,而且数量不固定。因此,该函数可接收不定数量的参数,同时其返回值为多个列。相比于普通的标量函数固定返回单一结果列(多列结果会被包含在 map 中),这是第一个返回多列的函数,我们对函数的实现进行了重构以实现多列函数的支持。

该函数的使用语法为 CHANGED_COLS (<prefix>, <ignoreNull>, <expr> [,...,<exprN>])。在下面的例子中,我们将检测 temperaturehumidity 列是否发生变化,如果发生变化,则返回变化的列的值,且为列名添加c_ 前缀,否则不返回对应的列。

SELECT CHANGED_COLS("c_", true, temperature, humidity) FROM demo
_________________________________________________________
{"c_temperature":23,"c_humidity":88}
{"c_temperature":25}
{"c_humidity":90}
{"c_humidity":91}

我们可以注意到,列的个数是可变的,同时列的参数也可以是别的表达式。列参数也支持 * 号,表示检测所有列,例如 SELECT CHANGED_COLS("c_", true, *) FROM demo

多列函数仅可在 select 子句中使用。其选出的值不能用于 WHERE 或其他子句中。若需要根据变化值做过滤,需要将 CHANGED_COLS 的规则作为规则流水线的前置规则。我们接下来将实现其他配套的变化检测函数,以标量函数的形式,支持获取变化值,从而在过滤等其余子句中进行使用。

1.4.3 版本动态

1.4.3 版本主要解决本月发现的一些问题。主要是共用连接在 MQTT 和 EdgeX 中的订阅同一个主题导致的问题。我们对共用连接的实现进行了重构,以解决这个问题。另外,我们还修复了预编译的 tdengine 插件运行崩溃的问题。

推荐阅读

2020-5-21eKuiper Team
Kuiper 正式成为 EdgeX 规则引擎

在 EdgeX Geneva 版本中, EMQX Kuiper - 基于 SQL 的轻量级流式数据处理软件与 EdgeX 进行了集成。本教程将介绍如何使用 Kuiper 处理来自于 EdgeX 的数据。