Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java客户端Api(DMSDK)从marklogic创建CSV文件_Csv_Marklogic_Java_Marklogic Corb - Fatal编程技术网

使用Java客户端Api(DMSDK)从marklogic创建CSV文件

使用Java客户端Api(DMSDK)从marklogic创建CSV文件,csv,marklogic,java,marklogic-corb,Csv,Marklogic,Java,Marklogic Corb,我想为marklogic db中的1.3M记录创建一个csv文件。我尝试使用CORB来实现这一点,但它花费的时间比我预期的要多。 我的数据是这样的 { "One": { "Name": "One", "Country": "US" }, "Two": { "State": "kentucky" }, "Three": { "Element1": "value1", "Element2": "value2", "Element3": "value3", "Element4": "valu

我想为marklogic db中的1.3M记录创建一个csv文件。我尝试使用CORB来实现这一点,但它花费的时间比我预期的要多。 我的数据是这样的

{
"One": {
"Name": "One",
"Country": "US"
}, 
"Two": {
"State": "kentucky"
}, 
"Three": {
"Element1": "value1", 
"Element2": "value2", 
"Element3": "value3", 
"Element4": "value4",
so on ...
}
}
下面是我的Corb模块

选择器.xqy

var total = cts.uris("", null, cts.collectionQuery("data"));
fn.insertBefore(total,0,fn.count(total))
xqy(我将所有元素保存在一个数组中)

我的属性文件

THREAD-COUNT=16
BATCH-SIZE=1000
URIS-MODULE=selector.sjs|ADHOC
PROCESS-MODULE=transform.sjs|ADHOC
PROCESS-TASK=com.marklogic.developer.corb.ExportBatchToFileTask
EXPORT-FILE-NAME=Report.csv
PRE-BATCH-TASK=com.marklogic.developer.corb.PreBatchUpdateFileTask
EXPORT-FILE-TOP-CONTENT=Col1,col2,....col16 -- i have 16 columns 
创建csv文件花费了1个多小时。而且,为了在集群中进行尝试,我需要首先配置负载平衡器。而Java客户端api将在没有任何负载平衡器的情况下在所有节点之间分发工作

我知道我可以使用
ServerTransform
ApplyTransformListener
触发转换模块

public static void main(String[] args) {
  // TODO Auto-generated method stub

  DatabaseClient client = DatabaseClientFactory.newClient
            ("localhost", pwd, "x", "x",  DatabaseClientFactory.Authentication.DIGEST);

  ServerTransform txform = new ServerTransform("tsm"); -- Here i am implementing same logic of above `tranform module` .

  QueryManager qm = client.newQueryManager();
  StructuredQueryBuilder query = qm.newStructuredQueryBuilder();
  query.collection();

  DataMovementManager dmm = client.newDataMovementManager();
  QueryBatcher batcher = dmm.newQueryBatcher(query.collections("data"));
  batcher.withBatchSize(2000)
         .withThreadCount(16)
         .withConsistentSnapshot()
         .onUrisReady(
           new ApplyTransformListener().withTransform(txform))
         .onBatchSuccess(batch-> {
                   System.out.println(
                       batch.getTimestamp().getTime() +
                       " documents written: " +
                       batch.getJobWritesSoFar());
         })
         .onBatchFailure((batch,throwable) -> {
           throwable.printStackTrace();
         });

  // start the job and feed input to the batcher
  dmm.startJob(batcher);

  batcher.awaitCompletion();
  dmm.stopJob(batcher);
  client.release();
}
但是我如何发送像CORB中那样的csv文件头(即EXPORT-file-TOP-CONTENT)。是否有实施
CSV
文件的文档?哪个类将实现这一点

谢谢你的帮助


谢谢

最简单的选择可能是ml gradle,它在后台使用Java客户端API和DMSDK

请注意,您可能希望安装服务器端REST转换,以仅提取CSV输出中所需的数据,而不是下载整个文档内容,然后在Java端提取

有关使用DMSDK和创建聚合CSV(所有记录一个CSV)所需的代码的工作示例,请参阅。为此,这里是关键代码片段(进行了一些小的简化更改,包括编写列标题(未测试的代码)):

但是,除非您知道您的内容没有双引号、换行符或非ascii字符,否则建议使用CSV库来确保正确转义输出。要使用CSV库,您当然可以使用库中的任何教程。您不必担心线程安全,因为ExportToWriterListener在同步块中运行侦听器,以防止对写入程序的重复写入。给你


请注意,您不必使用ExportToWriterListener。您可以将其作为编写自己的侦听器的起点。特别是,因为您主要关心的是性能,所以您可能希望让侦听器为每个线程写入一个文件,然后在后处理中将这些内容组合在一起。这取决于您。

最简单的选择可能是ml gradle,它在后台使用Java客户端API和DMSDK

请注意,您可能希望安装服务器端REST转换,以仅提取CSV输出中所需的数据,而不是下载整个文档内容,然后在Java端提取

有关使用DMSDK和创建聚合CSV(所有记录一个CSV)所需的代码的工作示例,请参阅。为此,这里是关键代码片段(进行了一些小的简化更改,包括编写列标题(未测试的代码)):

但是,除非您知道您的内容没有双引号、换行符或非ascii字符,否则建议使用CSV库来确保正确转义输出。要使用CSV库,您当然可以使用库中的任何教程。您不必担心线程安全,因为ExportToWriterListener在同步块中运行侦听器,以防止对写入程序的重复写入。给你


请注意,您不必使用ExportToWriterListener。您可以将其作为编写自己的侦听器的起点。特别是,因为您主要关心的是性能,所以您可能希望让侦听器为每个线程写入一个文件,然后在后处理中将这些内容组合在一起。这取决于您。

请注意,ApplyTransferorMListener通常不用于导出内容,而是用于就地转换内容。请注意,ApplyTransferorMListener通常不用于导出内容,正如您所说的
注意,您可能希望安装服务器端REST转换,以便仅提取CSV输出中需要的数据,而不是下载整个文档内容,然后在Java端提取。您的意思是不是加载文档
(即const node=cts.doc(name))
并提取内容
(即var a=node.xpath(“/One/*”))
。您希望像这样尝试
var value=cts.doc(name)/One/*
。正如您所说的
请注意,您可能希望安装服务器端REST转换以仅提取CSV输出中所需的数据,而不是下载整个文档内容,然后在Java端提取。您的意思是不是加载文档
(即const node=cts.doc(name))
并提取内容
(即var a=node.xpath(“/One/*”))
。您希望像这样尝试
var value=cts.doc(name)/One/*
public static void main(String[] args) {
  // TODO Auto-generated method stub

  DatabaseClient client = DatabaseClientFactory.newClient
            ("localhost", pwd, "x", "x",  DatabaseClientFactory.Authentication.DIGEST);

  ServerTransform txform = new ServerTransform("tsm"); -- Here i am implementing same logic of above `tranform module` .

  QueryManager qm = client.newQueryManager();
  StructuredQueryBuilder query = qm.newStructuredQueryBuilder();
  query.collection();

  DataMovementManager dmm = client.newDataMovementManager();
  QueryBatcher batcher = dmm.newQueryBatcher(query.collections("data"));
  batcher.withBatchSize(2000)
         .withThreadCount(16)
         .withConsistentSnapshot()
         .onUrisReady(
           new ApplyTransformListener().withTransform(txform))
         .onBatchSuccess(batch-> {
                   System.out.println(
                       batch.getTimestamp().getTime() +
                       " documents written: " +
                       batch.getJobWritesSoFar());
         })
         .onBatchFailure((batch,throwable) -> {
           throwable.printStackTrace();
         });

  // start the job and feed input to the batcher
  dmm.startJob(batcher);

  batcher.awaitCompletion();
  dmm.stopJob(batcher);
  client.release();
}
try (FileWriter writer = new FileWriter(outputFile)) {
  writer.write("uri,collection,contents");
  writer.flush();
  ExportToWriterListener exportListener = new ExportToWriterListener(writer)
    .withRecordSuffix("\n")
    .withMetadataCategory(DocumentManager.Metadata.COLLECTIONS)
    .onGenerateOutput(
      record -> {
        String uri = record.getUri();
        String collection = record.getMetadata(new DocumentMetadataHandle()).getCollections().iterator().next();
        String contents = record.getContentAs(String.class);
        return uri + "," + collection + "," + contents;
      }
    );

  QueryBatcher queryJob =
    moveMgr.newQueryBatcher(query)
      .withThreadCount(5)
      .withBatchSize(10)
      .onUrisReady(exportListener)
      .onQueryFailure( throwable -> throwable.printStackTrace() );
  moveMgr.startJob( queryJob );
  queryJob.awaitCompletion();
  moveMgr.stopJob( queryJob );
}