如何用QueryRecord拆分JSON的test字段为id和name字段?
在NiFi中拆分JSON的
test字段生成id和name字段 你提到用QueryRecord处理器时,数据库的SQL示例不生效,是因为NiFi的QueryRecord使用的是Apache Calcite SQL方言,函数用法和PostgreSQL/Oracle等略有区别,以下是适配的解决方案:
1. 核心SQL语句
在QueryRecord的「SQL Query」属性中编写如下语句,实现字段拆分:
SELECT -- 截取/之前的内容作为id SUBSTRING(test, 1, INSTR(test, '/') - 1) AS id, -- 截取/及之后的内容作为name SUBSTRING(test, INSTR(test, '/')) AS name, -- 保留原有的其他字段,按需列出 report_date, other_property1, other_property2 FROM flowfile
函数说明
INSTR(test, '/'):返回test字段中第一个/的位置索引SUBSTRING(字段, 起始位置, 长度):截取字符串,这里用SUBSTRING(test, INSTR(test, '/'))省略长度参数,会直接截取到字符串结尾
2. 兼容无/的场景
如果存在test字段不包含/的情况,可通过CASE语句做兼容处理:
SELECT CASE WHEN INSTR(test, '/') > 0 THEN SUBSTRING(test, 1, INSTR(test, '/') - 1) ELSE test -- 无/时直接将test作为id END AS id, CASE WHEN INSTR(test, '/') > 0 THEN SUBSTRING(test, INSTR(test, '/')) ELSE '' -- 无/时name设为空字符串 END AS name, report_date, other_property1, other_property2 FROM flowfile
3. 保留原test字段的写法
如果需要保留原test字段,可使用*搭配新增字段:
SELECT *, SUBSTRING(test, 1, INSTR(test, '/') - 1) AS id, SUBSTRING(test, INSTR(test, '/')) AS name FROM flowfile
配置注意事项
- 确保
QueryRecord的「Record Reader」和「Record Writer」都配置为JSON类型(如JsonTreeReader和JsonRecordSetWriter) - 若字段较多,建议明确列出需要保留的字段,避免不必要的字段被传递
内容的提问来源于stack exchange,提问作者fujidaon
相关产品推荐
相关产品推荐

