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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 08:26:25