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);