StreamSets文本转JSON遇阻:JS处理器无数据,Groovy报错求助
非标准键值对转JSON导入HDFS的优化方案
首先看你的输入数据,是类似{ 1046= 1047= 1048=5324800 ... }的非标准键值对格式,要转成合法JSON再导入HDFS,除了JavaScript Evaluator,有几个更靠谱的方案,还能解决你换Groovy后报错的问题:
方案一:用ReplaceText + JSONTransform 可视化处理(无需写复杂脚本)
这个方案适合不想写代码的场景,纯靠NiFi处理器配置完成转换:
- 第一步:ReplaceText 处理器:批量替换格式,把非标准键值对转成JSON结构
- 先替换键值对格式:用正则
(\d+)=(\S*)替换为"$1": "$2",把1048=5324800变成"1048": "5324800" - 再替换分隔符:用正则
(?<=") (?=")替换为,,把键值对之间的空格换成逗号分隔 - 最后修正首尾格式:把
{替换为{,把, }替换为},去掉多余的逗号和空格
- 先替换键值对格式:用正则
- 第二步:JSONTransform 处理器(可选):如果需要调整JSON结构(比如嵌套、字段重命名),可以用这个处理器做进一步标准化,确保输出是完全合法的JSON。
方案二:用ExecuteScript(Groovy)处理,解决你之前的报错问题
你之前用Groovy报错,大概率是用了错误的NiFi脚本模式——NiFi的ExecuteScript处理单流文件时,不是用records数组循环,而是要通过StreamCallback读取整个文件内容处理。给你一个能直接运行的Groovy脚本:
import org.apache.nifi.processor.io.StreamCallback import java.nio.charset.StandardCharsets def flowFile = session.get() if (!flowFile) return // 读取流文件内容并转换格式 flowFile = session.write(flowFile, { inputStream, outputStream -> def rawContent = inputStream.text // 分步转换非标准格式为JSON def jsonContent = rawContent .replaceAll(/(\d+)=(\S*)/, '"$1": "$2"') // 键值对加引号 .replaceAll(/\{ /, '{') // 去掉开头{后的空格 .replaceAll(/, \}/, ' }') // 去掉结尾前的多余逗号 .replaceAll(/(?<=") (?=")/, ', ') // 键值对之间加逗号 outputStream.write(jsonContent.getBytes(StandardCharsets.UTF_8)) } as StreamCallback) // 流转到成功队列 session.transfer(flowFile, REL_SUCCESS)
这个脚本会读取整个流文件的内容,批量转换格式后输出,完全适配你的输入数据。
方案三:用ConvertRecord 处理器(最规范的Record处理方式)
如果你的数据量较大,或者需要长期维护,推荐用NiFi的Record API来处理:
- 配置RegexRecordReader:自定义正则表达式
\{(?<content>[^}]+)\}捕获键值对内容,再用子正则(\d+)=(\S*)提取每个字段的键和值 - 配置JsonRecordWriter:直接将读取到的Record转换成标准JSON格式输出
这种方式不需要写脚本,全靠可视化配置,而且性能更优,适合生产环境。
为什么你的JavaScript Evaluator没读到记录?
大概率是输入数据没有被正确分割为多条记录:比如NiFi默认的行分隔符和你的数据换行不匹配,或者处理器的Record Reader配置错误,导致records数组为空,循环根本没执行。你可以先检查一下输入流文件的内容格式,以及处理器的"Record Reader"配置是否正确。
内容的提问来源于stack exchange,提问作者user6325753
相关产品推荐
相关产品推荐

