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>