Spark mode - SDMX source
Le module vtl-sdmx
expose les utilitaires suivants.
Outils disponibles
Utilitaire buildStructureFromSDMX3
TrevasSDMXUtils.buildStructureFromSDMX3
permet d'obtenir une Trevas DataStructure.
En fournissant les données correspondantes, vous pouvez créer un Trevas Dataset.
Structured.DataStructure structure = TrevasSDMXUtils.buildStructureFromSDMX3("path/sdmx_file.xml", "STRUCT_ID");
SparkDataset ds = new SparkDataset(
spark.read()
.option("header", "true")
.option("delimiter", ";")
.option("quote", "\"")
.csv("path"),
structure
);
Objet SDMXVTLWorkflow
Le constructeur SDMXVTLWorkflow
contient 3 arguments:
- un
ScriptEngine
(Trevas ou autre) - un
ReadableDataLocation
pour prendre en charge un message SDMX - une correspondance entre noms et Datasets
SparkSession.builder()
.appName("test")
.master("local")
.getOrCreate();
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByExtension("vtl");
engine.put(VtlScriptEngine.PROCESSING_ENGINE_NAMES, "spark");
ReadableDataLocation rdl = new ReadableDataLocationTmp("src/test/resources/DSD_BPE_CENSUS.xml");
SDMXVTLWorkflow sdmxVtlWorkflow = new SDMXVTLWorkflow(engine, rdl, Map.of());
Cet objet permet alors d'accéder aux 3 fonctions suivantes.
Fonction SDMXVTLWorkflow run
- Mode aperçu
La fonction run
peut facilement être appelée en mode aperçu, sans données jointes.
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByExtension("vtl");
engine.put(VtlScriptEngine.PROCESSING_ENGINE_NAMES, "spark");
ReadableDataLocation rdl = new ReadableDataLocationTmp("src/test/resources/DSD_BPE_CENSUS.xml");
SDMXVTLWorkflow sdmxVtlWorkflow = new SDMXVTLWorkflow(engine, rdl, Map.of());
// instead of using TrevasSDMXUtils.buildStructureFromSDMX3 and data sources
// to build Trevas Datasets, sdmxVtlWorkflow.getEmptyDatasets()
// will handle SDMX message structures to produce Trevas Datasets
// with metadata defined in this message, and adding empty data
Map<String, Dataset> emptyDatasets = sdmxVtlWorkflow.getEmptyDatasets();
engine.getBindings(ScriptContext.ENGINE_SCOPE).putAll(emptyDatasets);
Map<String, PersistentDataset> result = sdmxVtlWorkflow.run();
Le mode aperçu permet de vérifier la conformité du fichier SDMX et des métadonnées des jeux de données en sortie.
Fonction SDMXVTLWorkflow run
Une fois qu'un SDMXVTLWorkflow
est construit, il est facile d'exécuter les validations et transformations VTL définies dans le fichier SDMX.
Structured.DataStructure structure = TrevasSDMXUtils.buildStructureFromSDMX3("path/sdmx_file.xml", "ds1");
SparkDataset ds1 = new SparkDataset(
spark.read()
.option("header", "true")
.option("delimiter", ";")
.option("quote", "\"")
.csv("path/data.csv"),
structure
);
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByExtension("vtl");
engine.put(VtlScriptEngine.PROCESSING_ENGINE_NAMES, "spark");
Map<String, Dataset> inputs = Map.of("ds1", ds1);
ReadableDataLocation rdl = new ReadableDataLocationTmp("path/sdmx_file.xml");
SDMXVTLWorkflow sdmxVtlWorkflow = new SDMXVTLWorkflow(engine, rdl, inputs);
Map<String, PersistentDataset> bindings = sdmxVtlWorkflow.run();
En conséquence, on recevra l'ensemble des données définies comme persistantes dans la définition TransformationSchemes
.
Fonction SDMXVTLWorkflow getTransformationsVTL
Permet d'obtenir le code VTL correspondant à la définition SDMX TransformationSchemes.
SDMXVTLWorkflow sdmxVtlWorkflow = new SDMXVTLWorkflow(engine, rdl, Map.of());
String vtl = sdmxVtlWorkflow.getTransformationsVTL();
Fonction SDMXVTLWorkflow getRulesetsVTL
Permet d'obtenir le code VTL correspondant à la définition SDMX TransformationSchemes.
SDMXVTLWorkflow sdmxVtlWorkflow = new SDMXVTLWorkflow(engine, rdl, Map.of());
String dprs = sdmxVtlWorkflow.getRulesetsVTL();
Dépannage
Hadoop client
L'intégration de vtl-modules
avec hadoop-client
peut poser des problèmes de dépendances.
Il a été remarqué que com.fasterxml.woodstox.woodstox-core
est importé par hadoop-client
, avec une version incompatible avec la sous-dépendance vtl-sdmx
.
Une façon de résoudre ce problème est d'exclure com.fasterxml.woodstox.woodstox-core
de hadoop-client
et d'importer une version plus récente dans votre pom.xml
:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.3.4</version>
<exclusions>
<exclusion>
<groupId>com.fasterxml.woodstox</groupId>
<artifactId>woodstox-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.fasterxml.woodstox</groupId>
<artifactId>woodstox-core</artifactId>
<version>6.5.1</version>
</dependency>