Как обработать большой массив JSON с помощью Apache Camel - PullRequest
0 голосов
/ 17 января 2019

Я хочу добиться чего-то похожего на потоковую обработку CSV:

//read input file
.split(body().tokenize("\n", 100, false)).streaming()
            .unmarshal(new BindyCsvDataFormat( ...

Я могу контролировать содержимое входного файла, например, у меня может быть каждый объект JSON на новой строке без стартового массива JSON и запятой после каждого объекта:

{"id": "foo1"}
{"id": "foo2"}
...

И затем следуйте тому же потоку, что и в CSV (split и stream), но я не могу разархивировать, используя ListJacksonDataFormat или .json(JsonLibrary.Jackson)

Как это сделать? Или есть другой способ чтения большого массива JSON?

Примечание: Эта обработка должна быть быстрой, поэтому я не могу позволить себе демаршалировать CSV, а затем маршала JSON, как объяснено здесь (что кажется грубым решением).

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Я получил следующее решение:

.split(body().tokenize("\n", 1_000, false))
.streaming()
.process(exchange -> {
    String[] body = exchange.getIn().getBody(String.class).split("\n");
    var records = new ArrayList<FooBar>(body.length);
    for(String line: body) {
         records.add(objectMapper.readValue(line, FooBar.class));
    }
    exchange.getIn().setBody(records);
})

objectMapper равно com.fasterxml.jackson.databind.ObjectMapper

Например, файл размером 3,5 ГБ был обработан за ~ 1,2 мин.

0 голосов
/ 18 января 2019

Вы можете использовать jsonpath для разделения сообщений JSon (и включить потоковую передачу для больших сообщений в Splitter EIP)

https://github.com/apache/camel/blob/master/components/camel-jsonpath/src/main/docs/jsonpath-language.adoc

...