You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:50:12