CORB 在 CSV 中写入更少的文件?
CORB writing less files in 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 时,它只返回很少。
我已经按照 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 中还有任何函数可以在值之间保持分隔符(上面的 i.e.Means fn.concat
我正在连接所有字符串(abcdeuri),但我想要的是分隔符每个都带有 ,
(a,b,c,d,e,uri)。我尝试使用 fn.stringJoin
但我不能向其中发送超过三个值 )
感谢任何帮助。
谢谢
问题是 。您正在 for 循环内生成字符串,因此当您将 BATCH-SIZE 设置为大于 1 时,只有 for 循环中的最后一项被 returned。
您可以增加 THREAD-COUNT 并保持 BATCH-SIZE=1 并且应该在不更改过程的情况下获得所需的输出模块。
为了使您的处理模块 return 具有 BATCH-SIZE 大于 1 的所需结果,您需要在处理数据时收集结果在 for 循环内部,然后 return for 循环外部的所有数据。您可以通过推入数组变量然后使用 Sequence.from().
return 字符串序列来收集数据
您可以使用 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);
我是 运行 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 中还有任何函数可以在值之间保持分隔符(上面的 i.e.Means fn.concat
我正在连接所有字符串(abcdeuri),但我想要的是分隔符每个都带有 ,
(a,b,c,d,e,uri)。我尝试使用 fn.stringJoin
但我不能向其中发送超过三个值 )
感谢任何帮助。
谢谢
问题是
您可以增加 THREAD-COUNT 并保持 BATCH-SIZE=1 并且应该在不更改过程的情况下获得所需的输出模块。
为了使您的处理模块 return 具有 BATCH-SIZE 大于 1 的所需结果,您需要在处理数据时收集结果在 for 循环内部,然后 return for 循环外部的所有数据。您可以通过推入数组变量然后使用 Sequence.from().
return 字符串序列来收集数据您可以使用 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);