У меня есть следующая задача. У нас есть файлы csv, которые мы хотим загрузить в базу данных MarkLogic, используя mlcp. Мы также хотим преобразовать загруженные строки во время загрузки в источники OBI, поэтому мы строим для этого функцию преобразования.mlcp преобразует файл csv в источники OBI
Теперь я борюсь с трансформацией. Без преобразования данные загружаются как документ для каждой строки, как ожидалось. Пример
CSV:
voornaam,achternaam
hugo,koopmans
thijs,van ulden
спектрально-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.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
выход МЛКП:
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(), но тогда я ударил (ошибку принуждения документа-узел) ...
Пожалуйста совет ...
Рад, что вы это поняли. Примите ваш ответ, чтобы переместить его из списка «без ответа». (Да, этикета StackOverflow побуждает вас это делать.) –
Я замечаю две мелочи: во-первых, '$ the-doc' уже является узлом документа, поэтому зачем брать элемент' root' и снова переносить его как документ- узел. Я думаю, вы можете использовать '$ the-doc' непосредственно вместо' $ root'. Во-вторых, вы обновляете '$ content' значение, возвращаемое из' source: create-source', но я думал, что функция уже вставляет документ в базу данных. Я думаю, вы можете просто вернуть туда пустую последовательность. – grtjn