CORB在CSV中写入较少的文件?

时间:2018-02-13 17:30:08

标签: marklogic marklogic-corb

我正在运行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时,它只会停止很少。

我跟着this documentation设置了我的选择器和转换模块。下面是我的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)但我想要的是用{分隔它们中的每一个{1}}(a,b,c,d,e,uri)。我尝试使用,,但我不能发送超过三个值)

感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:2)

问题在于only the last evaluated expression is returned from a JavaScript module。您正在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);