Получить данные из json объекта внутри CSV, используя apache -nifi - PullRequest
0 голосов
/ 06 февраля 2020

Мой CSV содержит

date,name,department
2020-2-4,sachith,{dep_name:computer,location:2323,3434}
2020-2-5,nalaka,{dep_name:engineering,location:3343,5454}

Конечный CSV должен выглядеть следующим образом:

date,name,dep_name,lat,lot
2020-2-4,sachith,computer,2323,3434
2020-2-5,nalaka,engineering,3343,5454

здесь lat,lot взяты из location:3343,5454 данных.

У меня есть пытался использовать UpdateRecord процессор для этого. В нем есть некоторые ${field.value:join(','):substringAfter('dep_name:')}

Но это не работает. Как я могу выполнить это, используя apache -nifi?

1 Ответ

2 голосов
/ 06 февраля 2020

plain groovy для проверки скрипта в groovyConsole:

import groovy.json.*

def parser = new JsonSlurper().setType(JsonParserType.LAX) //LAX to accept strings without double-quotes

def w = System.out
new StringReader('''date,name,department
2020-2-4,sachith,{"dep_name":"computer","location":"2323,3434"}
2020-2-5,nalaka,{"dep_name":"engineering","location":"3343,5454"}''').withReader{r->
    r.eachLine{line, lineNum->
        if(lineNum==1){
            w<<line<<',lon,lat'<<'\n'
        }else{
            def row=line.split(',')          //split line by coma
            def json=row[2..-1].join(',')    //join back to string starting from 3rd element
            json = parser.parseText(json)
            w<<"${row[0]},${row[1]},${json.dep_name},${json.location}"<<'\n'
        }
    }
}

теперь тот же скрипт, модифицированный для процессора nifi ExecuteGroovyScript:

import groovy.json.*

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

def parser = new JsonSlurper().setType(JsonParserType.LAX)

ff.write{streamIn,streamOut->
    streamIn.withReader('UTF-8'){r->      //convert in stream to reader
        streamOut.withWriter('UTF-8'){w-> //convert out stream to writer
            //go line by line
            r.eachLine{line, lineNum->
                if(lineNum==1){
                    w<<line<<',lon,lat'<<'\n'        //for the first line just add some headers
                }else{
                    def row=line.split(',')          //split line by coma
                    def json=row[2..-1].join(',')    //join back to string starting from 3rd element
                    json = parser.parseText(json)
                    w<<"${row[0]},${row[1]},${json.dep_name},${json.location}"<<'\n'
                }
            }
        }
    }
}
REL_SUCCESS<<ff

...