CORB пишет меньше файлов в CSV?

Я использую CORB для преобразования моих данных в CSV . Когда я бегу с THREAD-COUNT-1 это работает отлично, значит, я получаю все выходные данные в файле CSV . Но когда я увеличил размер потока и размер пакета, он показывает меньшее количество выходных файлов в моем файле CSV . Я не знаю почему?

Ниже мой файл свойств

THREAD-COUNT=5
BATCH-SIZE=10
URIS-MODULE=selector.sjs|ADHOC
PROCESS-MODULE=transform.sjs|ADHOC
PROCESS-TASK=com.marklogic.developer.corb.ExportBatchToFileTask
EXPORT-FILE-NAME=HelloWorldReport.csv
PRE-BATCH-TASK=com.marklogic.developer.corb.PreBatchUpdateFileTask
EXPORT-FILE-TOP-CONTENT=a,b,c,d,e,uri

Но в командной строке CORB я вижу все Uris. Но когда пишете в CSV, то возвращаются только немногие.

Я следовал этой документации для настройки моего селектора и модуля преобразования. Ниже мой модуль selector.sjs

var total = cts.uris("", null, cts.collectionQuery("data"));
fn.insertBefore(total,0,fn.count(total))

В моем transform.sjs я получаю элементы из своих документов, а затем объединяю их

var name = fn.tokenize(URI, ";");
for ( var uri of name) {
let obj = fn.head(fn.doc(uri)).toObject();
var a = obj.Name;
var b = obj.Country;
var c = obj.State;
var d = obj.Code;
var e = obj.University;
fn.concat(a,b,c,d,e,uri);
}

А также есть ли в Marklogic какая-либо функция для хранения разделителя между значениями (т.е. в приведенном выше fn.concat Я объединяю все строки (abcdeuri), но я хочу разграничить каждую из них ,(А, б, в, г, д, URI). Я пытался с помощьюfn.stringJoin но я не могу отправить более трех значений в него)

Любая помощь приветствуется.

Спасибо

1 ответ

Решение

Проблема в том, что из модуля JavaScript возвращается только последнее оцененное выражение. Вы генерируете строки внутри цикла for, поэтому, когда вы устанавливаете BATCH-SIZE больше 1, возвращается только последний элемент из вашего цикла for.

Вы можете увеличить свою THREAD-COUNT и оставить BATCH-SIZE= 1 и получить желаемый результат без изменения модуля процесса.

Чтобы ваш процессный модуль возвратил желаемые результаты с размером BATCH-SIZE больше 1, вам нужно собирать результаты при обработке данных внутри цикла for, а затем возвращать все данные вне цикла for. Вы можете собрать данные, нажав в переменную Array, а затем вернуть последовательность строк, используя Sequence.from ().

Вы можете использовать функцию fn.stringJoin() для создания CSV. Первый параметр - это последовательность значений, которую вы можете поместить в массив, а второй параметр - это значение, к которому нужно присоединиться.

var URI;
var name = fn.tokenize(URI, ";");
var results = [];
for ( var uri of name) {
let obj = fn.head(fn.doc(uri)).toObject();
var a = obj.Name;
var b = obj.Country;
var c = obj.State;
var d = obj.Code;
var e = obj.University;
results.push(fn.stringJoin([a,b,c,d,e,uri], ","));
}
Sequence.from(results);
Другие вопросы по тегам