mlcp преобразовать файл csv в источники OBI

Передо мной стоит следующая задача. У нас есть файлы csv, которые мы хотим загрузить в базу данных MarkLogic с помощью mlcp. Мы также хотим преобразовать загруженные строки во время загрузки в источники OBI, поэтому мы создаем для этого функцию преобразования.

Теперь я борюсь с трансформацией. Без преобразования данные загружаются как документ для каждой строки, как и ожидалось.

csv пример:

voornaam,achternaam
hugo,koopmans
thijs,van ulden

transform-ambulance.xqy:

xquery version "1.0-ml";
module namespace rws = "http://marklogic.com/rws";

import module namespace source = "http://marklogic.com/solutions/obi/source" at "/ext/obi/lib/source-lib.xqy";

(: If the input document is XML, create an OBI source from it, with the value
 : specified in the input parameter. If the input document is not
 : XML, leave it as-is.
 :)
declare function rws:transform(
  $content as map:map,
  $context as map:map
) as map:map*
{
  let $attr-value := 
    (map:get($context, "transform_param"), "UNDEFINED")[1]
  let $the-doc := map:get($content, "value")
  return
    if (fn:empty($the-doc/element()))
    then $content
    else
      let $root := xdmp:unquote($the-doc/*)
      let $source-title := "ambulance source data"
      let $collection := 'ambulance'
      let $source-id := source:create-source($source-title, (),$root)      
      let $_ := xdmp:document-add-collections(concat("/marklogic.solutions.obi/source/", $source-id[1],".xml"), $collection)
      return (
        map:put($content, "value",
          $source-id[2]
        ), $content
      )
};

команда mlcp:

mlcp.sh import \
 -host localhost \
 -port 27041 \
 -username admin \
 -password admin \
 -input_file_path ./sampledata/so-example.csv \
 -input_file_type delimited_text \
 -transform_module /transforms/transform-ambulance.xqy \
 -transform_namespace "http://marklogic.com/rws" \
 -mode local

вывод mlcp:

15/09/08 21:35:08 INFO contentpump.ContentPump: Hadoop library version: 2.6.0
15/09/08 21:35:08 INFO contentpump.LocalJobRunner: Content type: XML
15/09/08 21:35:08 INFO input.FileInputFormat: Total input paths to process : 1
15/09/08 21:35:10 WARN mapreduce.ContentWriter: XDMP-DOCROOTTEXT: xdmp:unquote(document{<root><voornaam>hugo</voornaam><achternaam>koopmans</achternaam></root>}) -- Invalid root text "hugokoopmans" at  line 1
15/09/08 21:35:10 WARN mapreduce.ContentWriter: XDMP-DOCROOTTEXT: xdmp:unquote(document{<root><voornaam>thijs</voornaam><achternaam>van ulden</achternaam></root>}) -- Invalid root text "thijsvan ulden" at  line 1
15/09/08 21:35:11 INFO contentpump.LocalJobRunner:  completed 100%
15/09/08 21:35:11 INFO contentpump.LocalJobRunner: com.marklogic.contentpump.ContentPumpStats: 
15/09/08 21:35:11 INFO contentpump.LocalJobRunner: ATTEMPTED_INPUT_RECORD_COUNT: 2
15/09/08 21:35:11 INFO contentpump.LocalJobRunner: SKIPPED_INPUT_RECORD_COUNT: 0
15/09/08 21:35:11 INFO contentpump.LocalJobRunner: Total execution time: 2 sec

Я пробовал без xdmp: unquote (), но потом обнаружил ошибку принуждения document-node () ...

Пожалуйста посоветуй...


person Hugo Koopmans    schedule 09.09.2015    source источник


Ответы (1)


хорошо, проблема заключалась в том, что нам нужно было преобразовать переменную $ root как document-node () ...

let $root := document {$the-doc/root}

решает вопрос.

person Hugo Koopmans    schedule 09.09.2015
comment
Рад, что ты это понял. Примите свой ответ, чтобы убрать его из списка неотвеченных. (Да, этикет StackOverflow поощряет вас к этому.) - person Dave Cassel; 11.09.2015
comment
Я заметил две мелочи: во-первых, $the-doc уже является узлом документа, так зачем же брать элемент root и снова оборачивать его как узел документа. Я думаю, вы можете использовать $the-doc напрямую вместо $root. Во-вторых, вы обновляете $content значением, возвращаемым из source:create-source, но я думал, что эта функция уже вставляет документ в базу данных. Я думаю, вы можете просто вернуть туда пустую последовательность. - person grtjn; 14.09.2015