NiFi 1.5: написание нестандартного XML с использованием ScriptedRecordSetWriter в Groovy - PullRequest
0 голосов
/ 11 января 2019

Я конвертирую CSV в XML, используя процессор ConvertRecord, передав схему avro. Поскольку в NiFi 1.5 нет XMLRecordSetWriter, я использую ScriptedRecordSetWriter. Я получил образец сценария xml Writer Groovy от nifi github

https://github.com/apache/nifi/blob/rel/nifi-1.5.0/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/resources/groovy/test_record_writer_inline.groovy

Я хочу настроить xml, например пользовательский тег записи, родительский тег и удаление пустых тегов.

Вход CSV

MovieID,Year,Genre
1,2000,Action
2,1997,Action|Adventure

Токовый выход с использованием образца кода

<record>
 <MovieID>1</MovieID>
 <Year>2000</Year>
 <Genre>Action</Genre>
</record>
<record>
 <MovieID>2</MovieID>
 <Year>1997</Year>
 <Genre>Action|Adventure</Genre>
</record>

Ожидаемый результат

<MovieList>
 <Movie>
  <MovieID>1</MovieID>
  <Year>2000</Year>
  <Genre>Action</Genre>
 </Movie>
 <Movie>
  <MovieID>2</MovieID>
  <Year>1997</Year>
  <Genre>Action|Adventure</Genre>
 </Movie>
</MovieList>

Вот пример кода от nifi github

import groovy.xml.MarkupBuilder

import org.apache.nifi.controller.AbstractControllerService
import org.apache.nifi.flowfile.FlowFile
import org.apache.nifi.logging.ComponentLog
import org.apache.nifi.schema.access.SchemaNotFoundException
import org.apache.nifi.serialization.RecordSetWriter
import org.apache.nifi.serialization.RecordSetWriterFactory
import org.apache.nifi.serialization.WriteResult
import org.apache.nifi.serialization.record.Record
import org.apache.nifi.serialization.record.RecordSchema
import org.apache.nifi.serialization.record.RecordSet
import org.apache.nifi.stream.io.NonCloseableOutputStream


class GroovyRecordSetWriter implements RecordSetWriter {
    private int recordCount = 0;
    private final OutputStream out;

    public GroovyRecordSetWriter(final OutputStream out) {
        this.out = out;
    }

    @Override
    WriteResult write(Record r) throws IOException {
        new OutputStreamWriter(new NonCloseableOutputStream(out)).with {osw ->
            new MarkupBuilder(osw).record {
                r.schema.fieldNames.each {fieldName ->
                    "$fieldName" r.getValue(fieldName)
                }
            }
        }

        recordCount++;
        WriteResult.of(1, [:])
    }

    @Override
    String getMimeType() {
        return 'application/xml'
    }

    @Override
    WriteResult write(final RecordSet rs) throws IOException {
        int count = 0

        new OutputStreamWriter(new NonCloseableOutputStream(out)).with {osw ->
            new MarkupBuilder(osw).recordSet {

                Record r
                while (r = rs.next()) {
                    count++

                    record {
                        rs.schema.fieldNames.each {fieldName ->
                            "$fieldName" r.getValue(fieldName)
                        }
                    }
                }
            }
        }
        WriteResult.of(count, [:])
    }

    public void beginRecordSet() throws IOException {
    }

    @Override
    public WriteResult finishRecordSet() throws IOException {
        return WriteResult.of(recordCount, [:]);
    }

    @Override
    public void close() throws IOException {
    }

    @Override
    public void flush() throws IOException {
    }
}

class GroovyRecordSetWriterFactory extends AbstractControllerService implements RecordSetWriterFactory {

    @Override
    RecordSchema getSchema(Map<String, String> variables, RecordSchema readSchema) throws SchemaNotFoundException, IOException {
        return null
    }

    @Override    
    RecordSetWriter createWriter(ComponentLog logger, RecordSchema schema, OutputStream out) throws SchemaNotFoundException,     IOException {
        return new GroovyRecordSetWriter(out)
    }

}

writer = new GroovyRecordSetWriterFactory()

Я новичок в заводной и нифи. Я искал любой пример, который реализовал то же самое, но не смог найти ни одного. Любая помощь или направление приветствуется. Спасибо !!

...