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

如何让NiFi直接读取Oracle视图中的合法JSON而非作为字符串处理

Oracle → NiFi → Solr 数据流转中JSON数组列的处理问题

问题背景

尝试搭建 Oracle → NiFi → Solr 的数据流转流程,普通列(varchar2、integer等)处理正常:使用ExecuteSQLRecord处理器执行select * from view语句,即可生成格式正确的JSON并顺利同步到Solr。

问题出在1:N关系的数组列上。原老旧ETL工具处理这类列时会生成如下XML:

<results>
    <row>
        <field name="town">sleepy town</field>
    </row>
    <row>
        <field name="town">boring town</field>
    </row>
</results>

其内置Solr组件会自动将上述XML转换为Solr中的JSON数组:

"array_column":
    ["sleepy town",
     "boring town"]

改用NiFi后,先尝试在Oracle视图中生成XML模仿旧流程,发现NiFi没有这种自动转换机制,于是将1:N列改为返回JSON数组格式,但遇到了新问题。

当前问题

Oracle视图返回的数组列内容为合法JSON数组:

select array_column from view

ARRAY_COLUMN
------------
["sleepy_town","boring town"]

但NiFi的ExecuteSQLRecord处理器跟踪数据时,该列被识别为带转义的字符串:

[
  {
    "SOME_ORDINARY_COLUMNS":"Everything looks great!",
    "ARRAY_COLUMN": "[\"sleepy town\",\"boring town\"]",
    "MORE_ORDINARY_COLUMNS":"Everything looks great!"
  }
]

引入Avro后,该列仍被标记为字符串类型:

{
  "SOME_ORDINARY_COLUMNS" : {
    "string" : "Everything looks great!"
  },
  "ARRAY_COLUMN" : {
    "string" :  "[\"sleepy town\",\"boring town\"]"
  },
  "MORE_ORDINARY_COLUMNS" : {
    "string" : "Everything looks great!"
  }
}

已尝试的解决方案

  • 修改JsonRecordSetWriter的Schema Write Strategy为Set 'avro.schema' Attribute,查看schema后使用Use 'Schema Text' Property强制将ARRAY_COLUMN设为字符串数组(尝试多种配置组合)
  • 尝试Avro Writer搭配QueryRecord处理器的不同组合,使用Avro/JSON Reader,分别采用推断模式和显式指定模式
  • 在QueryRecord处理器的JsonPathReader中设置JSONPath为$.ARRAY_COLUMN[*]或$.ARRAY_COLUMN.[*]
  • 将ExecuteSQLRecord的查询语句从select *改为select JSON_OBJECT(...)(包含子查询点表示法的变体)
  • 研究Oracle的VARRAY和嵌套表,未找到有效解决方向

以上尝试要么触发NiFi“无法将字符串转换为数组”的错误,要么数组列仍保持为转义字符串格式。

需求

希望通过NiFi原生处理器解决问题,无需依赖Groovy等自定义脚本,类似Oracle的FORMAT JSON选项,让NiFi直接识别Oracle返回的合法JSON数组,而非当作字符串处理。


内容的提问来源于stack exchange,提问作者John Chase

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 11:19:58