Record Filter

支持根据用户配置的表达式对输入数据做过滤。

配置详情

该算子的配置包括 GeneralBasicInput/Output 的详细信息,各字段的配置如下:

General

名称 是否必须 描述
Name Yes 算子名称
Description No 算子描述
Stage Library Yes 算子所属的库
Required Fields No 数据必须包含的字段,如果未包含指定字段,则 record 将被过滤掉
Preconditions No 数据必须满足的前提条件,如果不满足指定条件,则 record 将被过滤掉。例如:${record:value('/value') > 0}。有关 EL 语句的使用方法,参考 Expression Language
On Record Error Yes

对错误数据的处理方式,可选:

  • Discard:直接丢弃
  • Send to Error:发送至错误中心
  • Stop Pipeline:停止流任务运行

Basic

名称 是否必须 描述
Quality Filter No 根据数据质量过滤处理数据,只有符合质量条件的 record 才会进行此次处理
Filter Expression Yes 根据配置的表达式过滤数据,具体的表达式语法请参见下文中:Filter Expression 语法概要
Output Measurement ID Yes 满足 Filter Expression 的数据,其中的 measurementId 都会被替换为配置的 Output Measurement ID。注:如果一条数据满足多个 Filter Expression,那么这条记录会输出多次,且输出记录中的 mesurementId 都会被相应替换

Filter Expression 语法概要

为了支持更灵活方便的筛选数据,Filter Expression 配置支持使用 Aviator Script 来对输入数据进行过滤。 此处简要介绍针对该算子使用场景的相关语法及函数,如果需进一步了解细节,可参考Aviator Script 文档

基本类型及运算


类型 说明 示例
数字 可以为整数、浮点数等 123,3.1415
字符串 以单引号或者双引号括起来的连续字符 ‘hello’,”world”
+, -, *, / 加减乘除,+也可用于拼接字符串 1+1.2, 5/2, ‘ab’ + ‘c’
<, <=, >, >=, ==, != 比较运算符 3 != 1
&&, ||, ! 逻辑与/或/非运算符 true && false
变量

在 Filter Expression 配置中一般不会直接创建变量,Record Formatter 算子已经将输入的数据转换名字为 record 的对象以供使用。

内置对象 说明
record 输入数据会被转换为Map对象传入表达式执行上下文,可以通过 record 作为变量名进行访问。 注意:对于一批输入数据,record 仅代表其中一条数据,表达式会依次作用在一批数据中的每一条记录上。


由于 record 是一个 Map 对象,除了使用函数访问 Map 对象中内容外,Aviator 也提供了相应的语法。此处简要举例如下:

语法 说明
record.a.b 表示访问变量 record 上 a 属性中的 b 属性的值
#record.a[1].b 表示访问变量 record 上数组 a 中第 2 个(从 0 开始)对象的 b 属性值,注意:如果访问路径中变量是数组 /List 中元素,需要以 # 符号开始
#`record.name:a.b` 表示访问变量 record 上name:a 属性中 b 属性的值,注意:如果访问的属性/变量名称包含特殊字符,需要用 # 加上两个 `` 来包围
常用函数

Aviator Script 中内置了诸多函数,在此仅列出配置 Filter Expression 时候的常用函数,更多函数请参见 Aviator Script 文档

函数 说明
seq.contains_key(map, key) 从 list、数组或者 map 获取对应的元素值,对于 list 和数组, element 为元素的索引位置(从 0 开始),对于 map 来说, element 为 key
seq.get(map, element) 当 map 中存在 key 的时候(可能为 null),返回 true。对于数组和链表,key 可以是 index,当 index 在有效范围 [0..len-1],返回 true,否则返回 false
string.startsWith(s1,s2) 字符串 s1 是否以字符串 s2 开始,返回 Boolean
string.endsWith(s1,s2) 字符串 s1 是否以字符串 s2 结束,返回 Boolean
示例

对于如下一条记录:

{
    "orgId": "o15638787142121",
    "modelId": "Darwen_SGBuilding",
    "modelIdPath": "/Darwen_Building/Darwen_SGBuilding",
    "assetId": "UXQB9oLc",
    "pointId": "temp",
    "time": 1542609276270,
    "value": 23.4,
    "quality": 0,
    "dq": 0,
    "attr": {},
    "measurementId": "Darwen_SGBuilding::temp",
    "assetTags": {
        "DCMModel": {
            "DcmModel:Darwen_Building": null,
            "DcmModel:Darwen_SGBuilding": null
        }
    },
    "measurementTags": {
        "MyHaystack": {
            "MyHaystack:zone": {"floor": 2},
            "MyHaystack:co2": null,
            "MyHaystack:sensor": null
        }
    }
}


Filter Expression 示例 说明
seq.contains_key(record.assetTags.DCMModel, 'DcmModel:Darwen_SGBuilding') && #record.measurementTags.MyHaystack.MyHaystack:zone.floor > 1 先判断 record.assetTags.DCMModel 这个 Map 对象中是否包含名称为 DcmModel:Darwen_SGBuilding 的 Key,如果为真,则继续判断 record.measurementTags.MyHaystack.MyHaystack:zone.floor 是否大于 1,两者都为真,则返回 true

输出结果

输出示例

配置信息:

../../../_images/record_filter1.png ../../../_images/record_filter2.png