2015-11-12 31 views
5

Mam dwa pliki CSV:Jak korzystać OrientDB ETL tworzyć krawędzie tylko

Pierwszy zawierający ~ rekordy 500M w następującym formacie

id,name
10000023432,Tom User
13943423235,Blah Person

drugie zawierający ~ znajomy 1.5b relacje w następującym formacie

fromId,toId
10000023432,13943423235

Użyłem narzędzia ETL OrientDB do tworzenia wierzchołków z pierwszego pliku CSV. Teraz wystarczy utworzyć krawędzie, aby nawiązać między nimi połączenie przyjaźni.

Próbowałem wielu konfiguracji w pliku json ETL dotąd, ostatni mecz tego:

{ 
    "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" } 
      ] 
     } 
    } 
} 

Ale niestety, to również tworzy wierzchołek z „z” i „do” nieruchomość, oprócz do tworzenia krawędzi.

przy próbie usuwania transformator wierzchołków, proces ETL zgłasza błąd:

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 

Co ja tu brakuje?

Odpowiedz

0

z Java API można odczytać pliku CSV, a następnie utworzyć krawędzie

 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

Mam własny program ładujący za pomocą interfejsu API Java. Zastanawiałem się, czy jest to możliwe za pomocą narzędzia ETL, ponieważ w narzędziu są dostępne automatyczne przechwytywanie równoległości. Dzięki za odpowiedź. – lambdapilgrim

5

Można importować brzegi tych transformatorów 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" } } 
] 

„scalić” transformator dołączy do prądu csv line z powiązanym rekordem Person (jest to trochę dziwne, ale z jakiegoś powodu jest to konieczne, aby powiązać fromId z osobą źródłową).

Transformator "pola" usunie pola CSV dodane przez sekcję scalania. Możesz spróbować importować bez transformatora "field", aby zobaczyć różnicę.