StreamSets提供了强大的表达式语言,通过这些表达式语言能够完成源字段、源属性的获取,以便更好的组织数据传递给目标组件进行处理。因此熟练的掌握表达式语言,才能提高你的StreamSets的开发能力。
学习系列
- 数据对接-ETL之StreamSet学习之旅一
- 数据对接-ETL之StreamSet学习之旅二
- 数据对接-ETL之StreamSet学习之旅三
- 数据对接-ETL之StreamSet学习之旅四
- 数据对接-ETL之StreamSet学习之旅五
- 数据对接-ETL之StreamSet学习之旅六
- 数据对接-ETL之StreamSet学习之旅七 微服务
- 数据对接-ETL之StreamSet学习之旅八定时启动
- 数据对接-ETL之StreamSet学习之旅十与RabbitMq面对面
- 数据对接-ETL之StreamSet学习之旅九Pipelines的状态监听之WebHook钉钉篇
- 数据对接-ETL之StreamSet学习之旅十一Mysql同步到Snowflake
1、表达式语言介绍
StreamSets的表达式语言基于JSP 2.0的表达式语法,因此如果你熟悉JSP则可以快速浏览本篇文章即可,如果不熟悉也没有关系,通过阅读以下章节定能对于你的学习有很大的帮助。
表达式可以应用在处理组件中,例如“Expression Evaluator” 或“Stream Selector ”组件,当然还有其他的目标组件也支持表达式。在使用表达式时,StreamSets支持表达式自动完成功能,因此可以弹出选择框供你选择需要采用的表达式,对于新手来说,这就像一个庞大的帮助库。
表达式中可以使用下列内容:
- 常量
- 记录的列名
- 函数
- 预定义字符
- 运算符号
- 运行时参数
- 运行时属性
- 运行时资源
1.1 常量
- 数据类型常量
NULL常量 你可以在表达式中使用NULL,你可以检查NULL值或设置值为NULL例如:我们在表达式评估组件内增加如下设定:在流选择组件内设定如下表达式
整体流程如下:
我们点击眼睛按钮预览数据,则能看到数据记录的data字段被设定为null值,在点选流选择组件,则数据均流向了分支1。
1.2 预定义字符
表达式语言包括以下文字:
- 布尔文字-“ true”和“ false”
- 整数
- 浮点数
- 带单引号或双引号的字符串
- 字符串的转义字符:
\,例如:\\转义为\字符 - NULL-标识null值 例如:
# 返回true
${"true" == (record:value("/data")==NULL)}
1.3 运算符号
- 算数运算: + 、-、 * 、/、 %
- 逻辑运算: && 、|| 、 !
- 比较: ==、!=、<、>、<=、>=
- 空: empty 判断值是否为null或空字符串。
- if else then: ?: 例如:
# 判断是否为空
${ empty record:value("/data")}
运算符的优先级 [] > ()> 一元操作符(-、!、empty) >* / %> + - > <、>、<=、>= > == 、!=> && > || > ?:
1.4 函数
- 记录操作 :以
record:开头 ,例如 :record:value(<field path>) - Base64编码: 以
base64:开头,例如:base64:decodeBytes(<string>) - 列函数: 以
f:开头,例如 :f:index() - 文件函数: 以
file:开头,例如:file:fileExtension(<filepath>) - 数学函数:以
math:开头,例如:math:abs(<number>) - 管道函数:以
pipeline:开头,例如:pipeline:name() - 字符串函数:以
str:开头,例如:str:length(<string>) - 时间函数:以
time:开头,例如:time:now() - 凭据函数:以
credential开头,可以从安全的凭据存储中获取敏感信息。 - 数据产生函数:可以产生地址、财务相关、email、url、人相关信息、xeger相关函数(可根据正则生成随机数据)
- 其他函数: alert:info() emptyList() emptyMap() every(, <mm() | ss()>) field:field() isEmptyList() isEmptyMap() jvm:maxMemoryMB() length() list:join(, ) list:joinSkipNulls(, ) offset:column() runtime:availableProcessors() runtime:conf() runtime:loadResource(, <restricted: true | false>) runtime:loadResourceRaw(, <restricted: true | false>) sdc:hostname() sdc:id() size() uuid:uuid() vault:read(, ) - Deprecated vault:readWithDelay(, , ) - Deprecated
2、表达式自动完成
为了方便使用StreamSets,在表达式的书写方面提供了表达式自动完成功能,当你键入${}时按Ctrl+空格热键会弹出相关的表达式支持函数或参数等,不过由于这个热键一般被输入法霸占,所以可能无法使用,不过没有关系,只要你记得住需要调用函数的首字母,键入首字母即可弹出选择下拉框。
表达式列表采用颜色和首字母区分不同的类别:
- 蓝色F标识 记录字段类型
- 红色C标识 常量类型
- 绿色M标识 函数类型
- 紫色P标识 定义的运行时参数 当使用下箭头选择相应的表达式时,在右边会弹出功能提示信息。
3、表达式评估器修改范围
- 可以增加或修改字段
- 可以增加或修改记录头属性
- 可以增加或修改字段属性
字段名使用 / 开头,属性名不需要 / 开头。表达式以 ${ }包含限定,所有表达式都写在{}内。
4、表达式例子
4.1 条件表达式
| 序号 | 表达式 | 含义 |
|---|---|---|
| 1 | ${record:value('/payment_type') == 'CRD'} | 在“Stream Selector ”组件中使用时,此条件会将付款类型为信用卡的记录路由到流分支。 |
| 2 | ${record:value('[3]/State') == "MD"} | 在“Stream Selector ”组件中使用时,此条件会将列表集合状态为MD的记录路由到流分支。 |
| 3 | ${record:errorCode()=="FIELD_MERGER_02"} | 在“Stream Selector ”组件中使用时,此条件会将错误代码为FIELD_MERGER_02的记录路由到流分支。 |
| 4 | ${record:value("[20]/value") == ""} | 在警报中使用时,当指定的字段不包含任何数据时触发警报。 |
| 5 | ${record:type('/ID')=STRING} | 在“Stream Selector ”组件中使用时,将ID为字符串的记录路由到包含字段类型转换器的分支,以将字段转换为数字数据类型。 |
4.2 if-then -else 使用三元符 ? :
${record:value('/gender')=='1'?'M':(record:value('/gender')=='2'?'F':'U')}
4.3 字符串操作
替换空值为 unknown字符串
${record:valueOrDefault('/Payment', 'unknown')}
4.4 数字操作
该表达式可通过从总票价中减去小费,税金和通行费来计算旅行收入
${record:value(’/total_amount’) - (record:value(’/tip_amount’) + record:value(’/tolls’) + record:value(’/mta_tax’))}
5、小结
利用表达式,可以完成丰富的数据修改、组织的功能。所以掌握表达式的书写是进阶StreamSets的必备技能之一。