2015-09-09 15 views
5

Ho la seguente sfida. Abbiamo file CSV che vogliamo caricare nel database MarkLogic usando mlcp. Vogliamo anche trasformare le righe caricate durante il caricamento in sorgenti OBI, quindi creiamo una funzione di trasformazione per questo.mlcp trasforma il file csv in sorgenti OBI

Ora sto lottando con la trasformazione. Senza la trasformazione, i dati vengono caricati come doc per riga come previsto. esempio

csv:

voornaam,achternaam 
hugo,koopmans 
thijs,van ulden 

trasformare-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 
    ) 
}; 

comando 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 

uscita 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 

ho cercato senza la xdmp: unquote(), ma poi mi ha colpito a) errore di coercizione document-node (...

consiglio prego ...

risposta

1

ok così il problema era che ci serviva per lanciare la variabile $ root come document-node() ...

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

risolve il problema.

+0

Felice di averlo capito. Accetta la tua risposta per spostarla dalla lista "senza risposta". (Sì, l'etichetta StackOverflow ti incoraggia a farlo.) –

+0

Ho notato due piccole cose: in primo luogo, '$ the-doc' è già un nodo del documento, quindi perché prendere l'elemento' root' e avvolgerlo di nuovo come documento- nodo. Penso che tu possa usare '$ the-doc' direttamente invece di' $ root'. In secondo luogo, aggiorni '$ content' con un valore restituito da' source: create-source', ma ho pensato che la funzione inserisca già un documento nel database. Penso che puoi solo restituire una sequenza vuota lì. – grtjn