2015-11-12 52 views
5

Ho due file CSV:Come utilizzare OrientDB ETL per creare bordi solo

Prima contenente ~ record 500M nel seguente formato

id,name
10000023432,Tom User
13943423235,Blah Person

Seconda contenente ~ amico 1.5B relazioni nel seguente formato

fromId,toId
10000023432,13943423235

Ho utilizzato lo strumento ETL OrientDB per creare i vertici dal primo file CSV. Ora, ho solo bisogno di creare spigoli per stabilire una connessione di amicizia tra loro.

ho cercato configurazione multipla del file JSON ETL finora, l'ultimo dei quali questa:

{ 
    "config": {"parallel": true}, 
    "source": { "file": { "path": "path_to_file" } }, 
    "extractor": { "csv": {} }, 
    "transformers": [ 
     { "vertex": {"class": "Person", "skipDuplicates": true} }, 
     { "edge": { "class": "FriendsWith", 
        "joinFieldName": "from", 
        "lookup": "Person.id", 
        "unresolvedLinkAction": "SKIP", 
        "targetVertexFields":{ 
         "id": "${input.to}" 
        }, 
        "direction": "out" 
        } 
     }, 
     { "code": { "language": "Javascript", 
        "code": "print('Current record: ' + record); record;"} 
     } 
    ], 
    "loader": { 
     "orientdb": { 
      "dbURL": "remote:<DB connection string>", 
      "dbType": "graph", 
      "classes": [ 
       {"name": "FriendsWith", "extends": "E"} 
      ], "indexes": [ 
       {"class":"Person", "fields":["id:long"], "type":"UNIQUE" } 
      ] 
     } 
    } 
} 

Ma, purtroppo, questo crea anche il vertice con "da" e "per" la proprietà, oltre per creare il bordo.

Quando ho provare a rimuovere il trasformatore vertice, processo ETL genera un errore:

Error in Pipeline execution: com.orientechnologies.orient.etl.transformer.OTransformException: edge: input type '[email protected]3 
6a8' is not supported 
Exception in thread "OrientDB ETL pipeline-0" com.orientechnologies.orient.etl.OETLProcessHaltedException: Halt 
     at com.orientechnologies.orient.etl.OETLPipeline.execute(OETLPipeline.java:149) 
     at com.orientechnologies.orient.etl.OETLProcessor$2.run(OETLProcessor.java:341) 
     at java.lang.Thread.run(Thread.java:745) 
Caused by: com.orientechnologies.orient.etl.transformer.OTransformException: edge: input type '[email protected]36a8' is not suppor 
ted 
     at com.orientechnologies.orient.etl.transformer.OEdgeTransformer.executeTransform(OEdgeTransformer.java:107) 
     at com.orientechnologies.orient.etl.transformer.OAbstractTransformer.transform(OAbstractTransformer.java:37) 
     at com.orientechnologies.orient.etl.OETLPipeline.execute(OETLPipeline.java:115) 
     ... 2 more 

Che cosa mi manca qui?

risposta

0

Con API Java si poteva leggere il csv e quindi creare i bordi

 String nomeYourDb = "nomeYourDb"; 
     OServerAdmin serverAdmin; 
     try { 
      serverAdmin = new OServerAdmin("remote:localhost/"+nomeYourDb).connect("root", "root"); 
      if (serverAdmin.existsDatabase()) { 
       OrientGraph g = new OrientGraph("remote:localhost/"+nomeYourDb); 
       String csvFile = "path_to_file"; 
       BufferedReader br = null; 
       String line = ""; 
       String cvsSplitBy = " "; // your separator 
       try { 
        br = new BufferedReader(new FileReader(csvFile)); 
        int index=0; 
        while ((line = br.readLine()) != null) { 
         if(index==0){ 
          index=1; 
         } 
         else{ 
          String[] ids = line.split(cvsSplitBy); 
          String personFrom="(select from Person where id='"+ids[0]+"')"; 
          String personTo="(select from Person where id='"+ids[1]+"')"; 
          String query="create edge FriendsWith from "+personFrom+" to "+personTo; 
          g.command(new OCommandSQL(query)).execute(); 
         } 
        } 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       finally { 
       if (br != null) { 
         br.close(); 
       } 
      } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
+0

Ho il mio caricatore che utilizza l'API Java. Mi stavo chiedendo se è possibile utilizzare lo strumento ETL, perché ci sono ganci di parallelizzazione automatici nello strumento. Grazie per la risposta però. – lambdapilgrim

5

È possibile importare i bordi con questi trasformatori ETL:

"transformers": [ 
    { "merge": { "joinFieldName": "fromId", "lookup": "Person.id" } }, 
    { "vertex": {"class": "Person", "skipDuplicates": true} }, 
    { "edge": { "class": "FriendsWith", 
       "joinFieldName": "toId", 
       "lookup": "Person.id", 
       "direction": "out" 
       } 
    }, 
    { "field": { "fieldNames": ["fromId", "toId"], "operation": "remove" } } 
] 

Il "merge" trasformatore si unirà l'attuale linea csv con record Persona correlato (questo è un po 'strano ma per qualche ragione questo è necessario associare da id con la persona sorgente).

Il trasformatore "campo" rimuoverà i campi csv aggiunti dalla sezione unione. Puoi provare l'importazione anche senza il trasformatore "campo" per vedere la differenza.