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