StreamSets 表达式语言篇 | 七日打卡

2,516 阅读4分钟

StreamSets提供了强大的表达式语言,通过这些表达式语言能够完成源字段、源属性的获取,以便更好的组织数据传递给目标组件进行处理。因此熟练的掌握表达式语言,才能提高你的StreamSets的开发能力。

学习系列

  1. 数据对接-ETL之StreamSet学习之旅一
  2. 数据对接-ETL之StreamSet学习之旅二
  3. 数据对接-ETL之StreamSet学习之旅三
  4. 数据对接-ETL之StreamSet学习之旅四
  5. 数据对接-ETL之StreamSet学习之旅五
  6. 数据对接-ETL之StreamSet学习之旅六
  7. 数据对接-ETL之StreamSet学习之旅七 微服务
  8. 数据对接-ETL之StreamSet学习之旅八定时启动
  9. 数据对接-ETL之StreamSet学习之旅十与RabbitMq面对面
  10. 数据对接-ETL之StreamSet学习之旅九Pipelines的状态监听之WebHook钉钉篇
  11. 数据对接-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的必备技能之一。 在这里插入图片描述