【问题标题】:JOLT concat values from nested array (Apache NiFi)嵌套数组中的 JOLT 连接值 (Apache NiFi)
【发布时间】:2020-12-30 15:33:50
【问题描述】:

我有一个 JSON:

{
  "reports": [
    {
      "columnHeader": {
        "metricHeader": {
          "metricHeaderEntries": [
            {
              "name": "ga:sessions",
              "type": "INTEGER"
            },
            {
              "name": "ga:bounces",
              "type": "INTEGER"
            },
            {
              "name": "ga:sessionDuration",
              "type": "TIME"
            },
            {
              "name": "ga:pageviews",
              "type": "INTEGER"
            }
          ]
        }
      },
      "data": {
        "rows": [
          {
            "metrics": [
              {
                "values": [
                  "25",
                  "18",
                  "1269.0",
                  "27"
                ]
              }
            ]
          }
        ],
        "totals": [
          {
            "values": [
              "25",
              "18",
              "1269.0",
              "27"
            ]
          }
        ],
        "rowCount": 1,
        "minimums": [
          {
            "values": [
              "25",
              "18",
              "1269.0",
              "27"
            ]
          }
        ],
        "maximums": [
          {
            "values": [
              "25",
              "18",
              "1269.0",
              "27"
            ]
          }
        ],
        "isDataGolden": true
      }
    }
  ]
}

metricHeaderEntriesvalues 是分开的。值在data.totals 数组中(顺序保存正确)。 我想修改 JSON 并获得以下结构(或类似于此,我只需要对 metric.name = metric.value):

{
  "metrics": [
            {
              "name": "ga:sessions",
              "value": "25"
            },
            {
              "name": "ga:bounces",
              "type": "18"
            },
            {
              "name": "ga:sessionDuration",
              "type": "1269.0"
            },
            {
              "name": "ga:pageviews",
              "type": "27"
            }
          ],
    "isDataGolden": true      
}

JOLT 可以吗? 之前我只使用shift 规范来完成一些非常简单的任务。以下规格:

[
  {
    "operation": "shift",
    "spec": {
      "reports": {
        "*": {
          "columnHeader": {
            "metricHeader": {
              "metricHeaderEntries": {
                "*": {
                  "name": "@(1,name)"
                }
              }
            }
          },
          "isDataGolden": "isDataGolden"
        }
      }
    }
  }
]

返回:

{
  "ga:sessions" : "ga:sessions",
  "ga:bounces" : "ga:bounces",
  "ga:sessionDuration" : "ga:sessionDuration",
  "ga:pageviews" : "ga:pageviews"
}

“几乎”。当然不是我想要的。我需要一个数组metrics,其中包含namevalue 字段,如上所述。但我不知道如何从data.totals 获取这些值并将它们放入指标中。 isDataGolden 也消失了。我读了一些关于modify-overwrite-beta 的文章,我可以将它用于我的案例吗?

【问题讨论】:

  • 脚本而不是 jolt 怎么样?
  • 如果 JOLT 无法实现,或者 JOLT 难以实现,我可以使用脚本。什么样的脚本?
  • reports下有多个元素怎么办?
  • 你的意思是这个场景的 JOLT 配置?我想如果我不能用 JOLT 解决它,我只是误会了。那么,脚本应该解决这个问题吗?我的脚本应该做什么?

标签: json apache-nifi jolt


【解决方案1】:

你可以使用executegroovyscript

import groovy.json.*

def ff=session.get()
if(!ff)return

//read flow file content and parse it
def body = ff.read().withReader("UTF-8"){reader-> 
    new JsonSlurper().parse(reader) 
}

def rep0=body.reports[0]

def result = [ 
    metrics : rep0.columnHeader.metricHeader.metricHeaderEntries.indexed().collect{i,m->
            [ 
                name : m.name,
                value: rep0.data.totals[0].values[i]
            ]
        }, 
    isDataGolden : rep0.data.isDataGolden 
]

//write new flow file content
ff.write("UTF-8"){writer-> 
    new JsonBuilder(result).writeTo(writer) 
}
//transfer
REL_SUCCESS << ff

【讨论】:

  • 非常感谢!我想为了获得更好的 Apache NiFi 体验,我应该从 Groovy 开始练习。因为 NiFi 的一些不常见的事情并不容易处理。
猜你喜欢
  • 2023-02-12
  • 2018-03-07
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多