Aller au contenu principal

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 ReadableDataLocationpour 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>