如何让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
相关产品推荐
相关产品推荐

