0 前言
Apache NiFi 是广泛使用的数据流管理工具,也可以实现ETL功能.
本次将讨论如何在NiFi实现ETL过程中实现转换功能,此处以列名转换为例.
1 应用场景
列名转换是ETL过程中常常遇到的场景。例如来源表user的主键id,要求写入目标表user的uid字段内,那么就需要列名转换.
2 方案选型
既然限定在 NiFi 框架内,那么只涉及实现方案选型.
2.1 基于执行自定义SELECT SQL 的 AS 语法
场景
适用于执行定制化SQL的场景,SQL形如
代码语言:javascript复制select id as uid from user
实现
处理器组实现如图
2.2 基于QueryRecord 处理器
场景
适用于使用 NiFi 组件生成SQL的场景
优势
- 通用性好
- 语法规范
实现
QueryRecord 的 SQL 形如
代码语言:javascript复制select id as uid from FLOWFILE
2.3 基于ExecuteGroovyScript 等可以执行脚本语言的处理器
场景
适用于要实现复杂转换,且性能要求不高的场景
实现
实现方式因人而异,原理就是在 Groovy 脚本内解析数据,做列名转换再输出即可
优势
能实现复杂规则,且可以热加载,不需要部署和重启NiFi
劣势
需要学习 nifi groovy 代码的编写方法
2.4 自定义处理器
场景
适用于要实现复杂转换,且性能要求高的场景
实现
类似 2.3 ,但是需要设计覆盖自己业务的转换规则,一般规则不仅有列名转换,还有类型转换,格式转换等复杂业务。
优势
能实现复杂规则
可以覆盖更多业务规则,不仅是列名转换
性能比2.3高很多
劣势
需要部署和重启NiFi
3 当前方案优势
目前项目上使用方案2.2,因为项目上业务简单,直接使用SQL上手容易,便于维护和知识转移
4 当前版本存在的不足及解决方法
QueryRecord SQL 支持功能有限,需要进一步拓展来满足更多业务需求
5 未来规划
- 拓展QueryRecord SQL 覆盖更多业务规则
- 拓展的同时,同时考虑兼容ANSI SQL的语法、提高出错验证提示的用户体验和SQL的运行性能