【问题标题】:Merge results of ExecuteSQL processor with Json content in nifi 6.0在 nifi 6.0 中将 ExecuteSQL 处理器的结果与 Json 内容合并
【发布时间】:2016-04-11 19:50:49
【问题描述】:

我正在处理包含地理坐标点的 json 对象。我想在本地的 postgis 服务器上运行这些点,以评估多边形匹配中的点。

我希望使用预先存在的处理器来执行此操作 - 我正在使用“EvaluateJsonPath”处理器成功地将纬度/经度坐标提取到属性中,并使用“ExecuteSQL”成功地向我的本地 postgis 数据存储发出查询。这给我留下了 avro 响应,然后我可以使用“ConvertAvroToJSON”处理器将其转换为 JSON。

我在如何将查询结果与原始 JSON 对象合并在一起时遇到了概念问题。事实上,我有两个具有相同片段 ID 的流文件,理论上我可以将它们与“mergecontent”合并在一起,但这让我明白了:

{"my":"original json", "coordinates":[47.38, 179.22]}{"polygon_match":"a123"}

是否有任何建议的策略将 SQL 查询的结果合并到原始 json 结构中,所以我的结果将是这样的:

{"my":"original json", "coordinates":[47.38, 179.22], "polygon_match":"a123"}

我正在运行 nifi 6.0、postgres 9.5.2 和 postgis 2.2.1。

我在https://community.hortonworks.com/questions/22090/issue-merging-content-in-nifi.html 中看到了一些关于使用replaceText 处理器的参考——但这似乎是将属性中的内容合并到内容的主体中。我错过了将原始内容与 SQL 响应的内容或从没有内容的 SQL 响应中提取的属性合并的要点。

编辑:

以下 Groovy 脚本似乎可以满足需要。我不是一个 groovy 编码器,所以欢迎任何改进。

import org.apache.commons.io.IOUtils
import java.nio.charset.*
import groovy.json.JsonSlurper

def flowFile = session.get();
if (flowFile == null) {
    return;
}
def slurper = new JsonSlurper()

flowFile = session.write(flowFile,
    { inputStream, outputStream ->
        def text = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
        def obj = slurper.parseText(text)
        def originaljsontext = flowFile.getAttribute('original.json')
        def originaljson = slurper.parseText(originaljsontext)
        originaljson.put("point_polygon_info", obj)
        outputStream.write(groovy.json.JsonOutput.toJson(originaljson).getBytes(StandardCharsets.UTF_8))
    } as StreamCallback)
session.transfer(flowFile, ExecuteScript.REL_SUCCESS)

【问题讨论】:

  • 关注 issues.apache.org/jira/browse/NIFI-361 ,它应该有助于以标准方式表达 JSON 转换。
  • 太棒了,谢谢@andrew - 这将非常有用,因为我对 nifi 所做的很多事情都是 json 转换!

标签: postgis apache-nifi


【解决方案1】:

如果您的原始 JSON 相对较小,可能的方法可能是以下...

  • 在进入 ExecuteSQL 之前使用 ExtractText 将原始 JSON 复制到属性中。
  • 在 ExecuteSQL 和 ConvertAvroToJSON 之后,使用 ExecuteScript 处理器创建一个新的 JSON 文档,该文档将属性中的原始文档与内容中的结果相结合。

我不确定脚本中需要做什么,但我知道其他人已经通过 ExecuteScript 处理器使用 Groovy 和 JsonSlurper 取得了成功。

【讨论】:

  • 在与 groovy 搏斗了一段时间后,我得到了一些令人满意的结果 - 不像人们希望的那样干净,但它有效 :) 脚本将被编辑到我的答案中。
猜你喜欢
  • 2023-02-10
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多