Apache NiFi中如何统一获取单行/多行SQL查询结果的首行数据
解决Apache NiFi单行/多行JSON统一取首行数据的问题
这里有三种实用方法,能让你不用区分单行/多行JSON结构,统一获取首行数据:
方法1:用QueryRecord处理器直接限制返回行数
在ExecuteSQL之后添加QueryRecord处理器,从数据源头避免单行/多行差异:
- 配置QueryRecord的
Record Reader为AvroReader(匹配ExecuteSQL的默认输出格式) - 添加SQL查询语句:
SELECT * FROM FLOWFILE LIMIT 1 - 后续用ConvertAvroToJSON转成JSON时,永远只会输出单个JSON对象,直接用
$.id就能获取首行id
这个方法最省心,不需要处理JSON结构的差异。
方法2:用JoltTransformJSON统一JSON结构
如果已经拿到JSON格式的数据,用Jolt转换把两种结构统一为单个对象:
- 添加JoltTransformJSON处理器,配置
Jolt Specification为:
[ { "operation": "shift", "spec": { "*": "[0].&", "@": "[0].&" } }, { "operation": "shift", "spec": { "[0]": "first_row" } } ]
- 转换后,不管原数据是单个对象还是数组,都会生成包含
first_row节点的JSON,之后用EvaluateJsonPath取$.first_row.id即可
方法3:用ExecuteScript处理器写脚本处理
如果需要更灵活的逻辑,用ExecuteScript(选择Groovy语言)直接处理JSON内容:
- 配置ExecuteScript的脚本内容为:
import groovy.json.JsonSlurper import groovy.json.JsonBuilder def flowFile = session.get() if (!flowFile) return def jsonContent = new JsonSlurper().parseText(flowFile.read().text) def firstRow = jsonContent instanceof List ? jsonContent[0] : jsonContent flowFile.write(new JsonBuilder(firstRow).toString()) session.transfer(flowFile, REL_SUCCESS)
- 处理后输出的永远是单个JSON对象,直接用
$.id就能获取首行id
内容的提问来源于stack exchange,提问作者just learner
相关产品推荐
相关产品推荐

