apache nifi - разделить строку json по значению поля - PullRequest
0 голосов
/ 30 ноября 2018

В Apache Nifi я хочу разбить строку файла json на основе содержимого поля, удаленного запятой.

Это пример моего входного файла потока:

{
    "name":"app",
    "os":"linux",
    "instance":"instance1,instance2,instance3,instance4"
}

И это как вывод:

{
    "name":"app",
    "os":"linux",
    "instance":"instance1"
},
{
    "name":"app",
    "os":"linux",
    "instance":"instance2"
},
{
    "name":"app",
    "os":"linux",
    "instance":"instance3"
},
{
    "name":"app",
    "os":"linux",
    "instance":"instance4"
}

Мне нужно знать, возможно ли реализовать эту задачу с помощью процессора joltTransformJson или я должен сделать это с помощью скрипта, в этом случае вы можете показатьнесколько похожих примеров скриптов.

Спасибо

1 Ответ

0 голосов
/ 30 ноября 2018

не знаю о толчке.

с ExecuteGroovyProcessor вы можете сделать это преобразование следующим образом:

import groovy.json.*

def ff=session.get()
if(!ff)return
//read stream, convert to reader, parse to objects
def json=ff.read().withReader("UTF-8"){r-> new JsonSlurper().parse(r) }
//transform json
json = json.instance.split(',').collect{e-> json+[instance:e] }
//write
ff.write("UTF-8"){w-> new JsonBuilder(json).writeTo(w)}
//transfer to success
REL_SUCCESS<<ff

То же самое, но для ExecuteScript процессора:

import groovy.json.*

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

ff = session.write(ff, {inputStream, outputStream ->
    def json=inputStream.withReader("UTF-8"){r-> new JsonSlurper().parse(r) }
    json = json.instance.split(',').collect{e-> json+[instance:e] }
    outputStream.withWriter("UTF-8"){w-> new JsonBuilder(json).writeTo(w)}
} as StreamCallback)

session.transfer(ff, REL_SUCCESS)
...