Implémentation de l'ETL sous OrientDB
Le module ETL sous OrientDB permet de transférer des données vers ou à partir d'une base de données OrientDB à l'aide du processus ETL, présenté comme suite :
Configuration : Le module ETL utilise un fichier de configuration, qui est écrit en JSON, pour définir les différents traitements à effectuer avant de charger les données dans la base de données.
Extractor : Extrait les données de la base de données source.
Transformer : Convertit le format des données sources vers un format accessible à la base de données source.
Loader : Charge les données dans la base de données source.
+-----------+-----------------------+-----------+
| | PIPELINE |
+ EXTRACTOR +-----------------------+-----------+
| | TRANSFORMERS | LOADER |
+-----------+-----------------------+-----------+
| FILE ==> CSV->FIELD->MERGE ==> OrientDB |
+-----------+-----------------------+-----------+
+-----------+-----------------------+-----------+ | | PIPELINE | + EXTRACTOR +-----------------------+-----------+ | | TRANSFORMERS | LOADER | +-----------+-----------------------+-----------+ | FILE ==> CSV->FIELD->MERGE ==> OrientDB | +-----------+-----------------------+-----------+
Méthode : Utilisation
Pour utiliser ce module, il faut tout d'abord localiser le path d'installation d'OrientDB
Après il faut de lancer le script bin/oetl.sh on lui passant le fichier de configuration de votre ETL.
Syntaxe : Syntaxe du fichier de configuration
{
"config": { "log": "debug" },
"source": { "file": { "path": "/path/to/your/csv/file.csv" } },
"extractor": {
"csv": {
"separator": ",",
"columnsOnFirstLine": true,
"columns": ["<field>:<fieldType>"[,]*]
}
},
"transformers": [
{ "vertex": { "class": "<className>" } },
[{ "edge": {
"class": "<className1>",
"joinFieldName": "<joinFiled>",
"lookup": "<className2>.<joinField>",
"direction": "IN | OUT"
}
},]*
],
"loader": {
"orientdb": {
"dbURL": "remote:localhost/databases/<dbName>",
"dbType": "graph",
"serverUser": "<username>",
"serverPassword": "<password>",
"classes": [
{"name": "<className>", "extends": "V | E | <className>"}[,]*
], "indexes": [
{"class":"<className>", "fields":[<field>[,]*], "type":"<UNIQUE | fieldType>" }
]
}
}
}
{ "config": { "log": "debug" }, "source": { "file": { "path": "/path/to/your/csv/file.csv" } }, "extractor": { "csv": { "separator": ",", "columnsOnFirstLine": true, "columns": ["<field>:<fieldType>"[,]*] } }, "transformers": [ { "vertex": { "class": "<className>" } }, [{ "edge": { "class": "<className1>", "joinFieldName": "<joinFiled>", "lookup": "<className2>.<joinField>", "direction": "IN | OUT" } },]* ], "loader": { "orientdb": { "dbURL": "remote:localhost/databases/<dbName>", "dbType": "graph", "serverUser": "<username>", "serverPassword": "<password>", "classes": [ {"name": "<className>", "extends": "V | E | <className>"}[,]* ], "indexes": [ {"class":"<className>", "fields":[<field>[,]*], "type":"<UNIQUE | fieldType>" } ] } } }
Exemple :
Supposant qu'on a une base de données relationnelle représentée par les deux tables suivantes et qu'on veut la transformer en une base de données OrientDB.
TABLE Student:
+----+----------------+
| id | studentName |
+----+----------------+
| 1 | Student 1 |
| 2 | Student 2 |
+----+----------------+
Student.csv
id,studentName
1,Student 1
2,Student 2
TABLE Student: +----+----------------+ | id | studentName | +----+----------------+ | 1 | Student 1 | | 2 | Student 2 | +----+----------------+ Student.csv id,studentName 1,Student 1 2,Student 2
TABLE UV:
+----+-----------+--------------+
| id | studentId | uvName |
+----+-----------+--------------+
| 0 | 1 | AI07 |
| 1 | 2 | AI07 |
| 10 | 1 | AI15 |
| 35 | 1 | AI05 |
+----+-----------+--------------+
Uv.csv
id,studentId,uvName
0,1,AI07
1,2,AI07
10,1,AI15
35,1,AI05
TABLE UV: +----+-----------+--------------+ | id | studentId | uvName | +----+-----------+--------------+ | 0 | 1 | AI07 | | 1 | 2 | AI07 | | 10 | 1 | AI15 | | 35 | 1 | AI05 | +----+-----------+--------------+ Uv.csv id,studentId,uvName 0,1,AI07 1,2,AI07 10,1,AI15 35,1,AI05
Fichier de configuration pour la table Student
{
"config": {
"log": "debug"
},
"source": { "file": { "path": "/path/to/your/csv/file/Student.csv" } },
"extractor": {
"csv": {
"separator": ",",
"columnsOnFirstLine": true,
"columns": ["id:Integer","studentName:String"]
}
},
"transformers": [
{ "vertex": { "class": "Student" } }
],
"loader": {
"orientdb": {
"dbURL": "remote:localhost/databases/StudentDB",
"dbType": "graph",
"serverUser": "root",
"serverPassword": "root",
"classes": [
{"name": "Uv", "extends": "V"},
{"name": "Student", "extends": "V"},
{"name": "HasUvs", "extends": "E"},
],
"indexes": [
{"class":"Student", "fields":["id:integer"], "type":"UNIQUE" }
]
}
}
}
{ "config": { "log": "debug" }, "source": { "file": { "path": "/path/to/your/csv/file/Student.csv" } }, "extractor": { "csv": { "separator": ",", "columnsOnFirstLine": true, "columns": ["id:Integer","studentName:String"] } }, "transformers": [ { "vertex": { "class": "Student" } } ], "loader": { "orientdb": { "dbURL": "remote:localhost/databases/StudentDB", "dbType": "graph", "serverUser": "root", "serverPassword": "root", "classes": [ {"name": "Uv", "extends": "V"}, {"name": "Student", "extends": "V"}, {"name": "HasUvs", "extends": "E"}, ], "indexes": [ {"class":"Student", "fields":["id:integer"], "type":"UNIQUE" } ] } } }
Dans la partie source, on indique le path vers le fichier CSV source.
Dans la partie extractor, on mentionne le type de l'extracteur à utiliser, dans cette exemple, c'est un CSV Extractor. Il y a plusieurs format supportés : Row, JDBC, JSON, XML.
Dans la partie transformers, on indique la classe vertex à utiliser.
Dans la partie loader, on indique le nom, path et les informations d'identification liée à la base de données qu'on souhaite utiliser, et on indique également les classes à créer si elles n'existe pas.
Fichier de configuration pour la table Uv
{
"config": {
"log": "debug"
},
"source": { "file": { "path": "/path/to/your/csv/file/Uv.csv" } },
"extractor": {
"csv": {
"separator": ",",
"columnsOnFirstLine": true,
"columns": ["id:Integer","studentName:String"]
}
},
"transformers": [
{ "vertex": { "class": "Uv" } },
{ "edge":
{
"class": "HasUvs",
"joinFieldName": "studentId",
"lookup": "Student.id",
"direction": "in"
}
}],
"loader": {
"orientdb": {
"dbURL": "remote:localhost/databases/StudentDB",
"dbType": "graph",
"serverUser": "root",
"serverPassword": "root",
"classes": [
{"name": "Uv", "extends": "V"},
{"name": "Student", "extends": "V"},
{"name": "HasUvs", "extends": "E"},
],
"indexes": [
{"class":"Uv", "fields":["id:integer"], "type":"UNIQUE" }
]
}
}
}
{ "config": { "log": "debug" }, "source": { "file": { "path": "/path/to/your/csv/file/Uv.csv" } }, "extractor": { "csv": { "separator": ",", "columnsOnFirstLine": true, "columns": ["id:Integer","studentName:String"] } }, "transformers": [ { "vertex": { "class": "Uv" } }, { "edge": { "class": "HasUvs", "joinFieldName": "studentId", "lookup": "Student.id", "direction": "in" } }], "loader": { "orientdb": { "dbURL": "remote:localhost/databases/StudentDB", "dbType": "graph", "serverUser": "root", "serverPassword": "root", "classes": [ {"name": "Uv", "extends": "V"}, {"name": "Student", "extends": "V"}, {"name": "HasUvs", "extends": "E"}, ], "indexes": [ {"class":"Uv", "fields":["id:integer"], "type":"UNIQUE" } ] } } }
Ce fichier est similaire au précédent, sauf que dans la partie transformers, on a rajouté un Edge transformer pour représenter la liaison entre les deux classes.