Aller au contenu principal

Trevas - VTL 2.1

· Une minute de lecture
Nicolas Laval
Making Sense - Developer

Trevas 1.7.0 met à niveau VTL en version 2.1.

Cette version introduit deux nouveaux opérateurs :

  • random
  • case

random produit un nombre décimal entre 0 et 1.

case permet de définir des déclarations multiconditionnelles plus claires, par exemple:

ds2 := ds1[ calc c := case when r < 0.2 then "Low" when r > 0.8 then "High" else "Medium" ]

Les deux opérateurs sont déjà disponibles dans Trevas !

La nouvelle grammaire fournit également des opérateurs temporels et inclut des corrections, sans aucun changement radical par rapport à la version 2.0.

Voir la section coverage pour plus de détails.

Trevas - Provenance

· 4 minutes de lecture
Nicolas Laval
Making Sense - Developer

Nouveautés

Trevas 1.6.0 introduit le module VTL Prov.

Ce module permet de produire des métadonnées de lineage à partir de Trevas, basées sur les ontologies RDF : PROV-O et SDTH.

Aperçu du modèle SDTH

Modèle adopté

Le module vtl-prov, version 1.6.0, utilise le modèle partiel suivant :

Des améliorations arriveront dans les prochaines semaines.

Outils disponibles

Les outils de provenance Trevas sont documentés ici.

Exemple

Cas d'utilisation métier

Deux jeux de données sources sont transformés pour produire des jeux de données transitoires et un jeu de données final permanent.

Entrées

ds1 & ds2 métadonnées:

idvar1var2
STRINGINTEGERNUMBER
IDENTIFIERMEASUREMEASURE

Script VTL

ds_sum := ds1 + ds2;
ds_mul := ds_sum * 3;
ds_res <- ds_mul[filter mod(var1, 2) = 0][calc var_sum := var1 + var2];

Modèle RDF cible

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX prov: <http://www.w3.org/ns/prov#>
PREFIX sdth: <http://rdf-vocabulary.ddialliance.org/sdth#>

# --- Program and steps
<http://example.com/program1> a sdth:Program ;
a prov:Agent ; # Agent? Or an activity
rdfs:label "My program 1"@en, "Mon programme 1"@fr ;
sdth:hasProgramStep <http://example.com/program1/program-step1>,
<http://example.com/program1/program-step2>,
<http://example.com/program1/program-step3> .

<http://example.com/program1/program-step1> a sdth:ProgramStep ;
rdfs:label "Program step 1"@en, "Étape 1"@fr ;
sdth:hasSourceCode "ds_sum := ds1 + ds2;" ;
sdth:consumesDataframe <http://example.com/dataset/ds1>,
<http://example.com/dataset/ds2> ;
sdth:producesDataframe <http://example.com/dataset/ds_sum> .

<http://example.com/program1/program-step2> a sdth:ProgramStep ;
rdfs:label "Program step 2"@en, "Étape 2"@fr ;
sdth:hasSourceCode "ds_mul := ds_sum * 3;" ;
sdth:consumesDataframe <http://example.com/dataset/ds_sum> ;
sdth:producesDataframe <http://example.com/dataset/ds_mul> .

<http://example.com/program1/program-step3> a sdth:ProgramStep ;
rdfs:label "Program step 3"@en, "Étape 3"@fr ;
sdth:hasSourceCode "ds_res <- ds_mul[filter mod(var1, 2) = 0][calc var_sum := var1 + var2];" ;
sdth:consumesDataframe <http://example.com/dataset/ds_mul> ;
sdth:producesDataframe <http://example.com/dataset/ds_res> ;
sdth:usesVariable <http://example.com/variable/var1>,
<http://example.com/variable/var2> ;
sdth:assignsVariable <http://example.com/variable/var_sum> .

# --- Variables
# i think here it's not instances but names we refer to...
<http://example.com/variable/id1> a sdth:VariableInstance ;
rdfs:label "id1" .
<http://example.com/variable/var1> a sdth:VariableInstance ;
rdfs:label "var1" .
<http://example.com/variable/var2> a sdth:VariableInstance ;
rdfs:label "var2" .
<http://example.com/variable/var_sum> a sdth:VariableInstance ;
rdfs:label "var_sum" .

# --- Data frames
<http://example.com/dataset/ds1> a sdth:DataframeInstance ;
rdfs:label "ds1" ;
sdth:hasName "ds1" ;
sdth:hasVariableInstance <http://example.com/variable/id1>,
<http://example.com/variable/var1>,
<http://example.com/variable/var2> .

<http://example.com/dataset/ds2> a sdth:DataframeInstance ;
rdfs:label "ds2" ;
sdth:hasName "ds2" ;
sdth:hasVariableInstance <http://example.com/variable/id1>,
<http://example.com/variable/var1>,
<http://example.com/variable/var2> .

<http://example.com/dataset/ds_sum> a sdth:DataframeInstance ;
rdfs:label "ds_sum" ;
sdth:hasName "ds_sum" ;
sdth:wasDerivedFrom <http://example.com/dataset/ds1>,
<http://example.com/dataset/ds2> ;
sdth:hasVariableInstance <http://example.com/variable/id1>,
<http://example.com/variable/var1>,
<http://example.com/variable/var2> .

<http://example.com/dataset/ds_mul> a sdth:DataframeInstance ;
rdfs:label "ds_mul" ;
sdth:hasName "ds_mul" ;
sdth:wasDerivedFrom <http://example.com/dataset/ds_sum> ;
sdth:hasVariableInstance <http://example.com/variable/id1>,
<http://example.com/variable/var1>,
<http://example.com/variable/var2> .

<http://example.com/dataset/ds_res> a sdth:DataframeInstance ;
rdfs:label "ds_res" ;
sdth:wasDerivedFrom <http://example.com/dataset/ds_mul> ;
sdth:hasVariableInstance <http://example.com/variable/id1>,
<http://example.com/variable/var1>,
<http://example.com/variable/var2>,
<http://example.com/variable/var_sum> .

Trevas - SDMX

· Une minute de lecture
Nicolas Laval
Making Sense - Developer

Nouveautés

Trevas 1.4.0 introduit le module VTL SDMX.

Ce module permet de consommer des sources de métadonnées SDMX pour instancier les structures de données et les ensembles de données Trevas.

Il permet également d'exécuter les VTL TransformationSchemes pour obtenir les ensembles de données persistants résultants.

Aperçu

Diagramme VTL SDMXDiagramme VTL SDMX

Trevas prend en charge les éléments de message SDMX ci-dessus. Seul l'élément VtlMappingSchemes est facultatif.

Les éléments de la case 1 sont utilisés pour produire des Trevas DataStructures, en valorisant les attributs des composants VTL : name, role, type, nullable et valuedomain.

Les éléments de la case 2 sont utilisés pour générer le code VTL (ensembles de règles et transformations).

Utilitaires disponibles

Les utilitaires de Trevas SDMX sont documentés ici.

Dépannage

Voir cette section.

Trevas - Opérateurs temporels

· 4 minutes de lecture
Hadrien Kohl
Hadrien Kohl Consulting - Developer

Opérateurs temporels de Trevas

La version 1.4.0 de Trevas introduit un support préliminaire pour les types de date et d'heure et les opérateurs.

La spécification décrit les types temporels tels que date, time_period, time et duration. Cependant, les auteurs de Trevas trouvent ces descriptions peu satisfaisantes. Cet article de blog décrit nos choix de mise en œuvre et en quoi ils diffèrent des spécifications.

Dans la spécification, time_period (et les types date) est décrit comme un type composé avec un début et une fin (ou un début et une durée). Cela complique la mise en œuvre et apporte peu de valeur au langage car on peut simplement fonctionner directement sur une combinaison de dates ou de date et de durée. Pour cette raison, nous avons défini une algèbre entre les types temporels et n'avons pas encore implémenté le type time_period.

résultat (opérateurs)dateduréenombre
daten/adate (+, -)n/a
duréedate (+, -)durée (+, -)durée (*)
numéron/adurée (*)n/a

La fonction period_indicator s'appuie sur la connaissance des périodes pour les types qui ne sont pas suffisamment définis pour le moment pour être implémentés.

Représentation Java

Le type VTL date est représenté en interne comme le type java.time.Instant, java.time.ZonedDateTime et [java.time.OffsetDateTime](https://docs.oracle.com/en%2Fjava%2Fjavase%2F11%2Fdocs%2Fapi%2F%2F/java.base/java/time/OffsetDateTime.html#: ~:text=OffsetDateTime%20is%20an%20immutable%20representation,be%20stored%20in%20an%20OffsetDateTime%20.)

Instant représente un moment précis dans le temps. Notez que ce type n'inclut pas les informations de fuseau horaire et est donc non utilisable avec tous les opérateurs. On peut utiliser les types ZonedDateTime et OffsetDateTime lorsque la sauvegarde du fuseau horaire est nécessaire.

Le type de VTL durée est représenté en interne comme le type org.troisten.extra.PeriodDuration du package threeten extra. Il représente une durée utilisant à la fois des unités calendaires (années, mois, jours) et une durée temporelle (heures, minutes, secondes et nanosecondes).

Fonction flow_to_stock

La fonction flow_to_stock convertit un ensemble de données avec interprétation par flux en une interprétation par stock. Cette transformation est utile lorsque vous souhaitez agréger des données de flux (par exemple, taux de ventes ou de production) en données de stock cumulées (par exemple, inventaire total).

Syntaxe:

résultat:= flow_to_stock(op)

Paramètres:

  • op - L'ensemble de données d'entrée avec interprétation du flux. L'ensemble de données doit avoir un identifiant de type time, des identifiants additionels, et au moins une mesure de type number.

Résultat:

La fonction renvoie un ensemble de données avec la même structure que celui en entrée, mais avec les valeurs converties en stock.

Fonction stock_to_flow

La fonction stock_to_flow convertit un ensemble de données avec interprétation de stock en une interprétation de flux. Ce La transformation est utile lorsque vous souhaitez dériver des données de flux à partir de données de stock cumulées.

Syntaxe:

résultat:= stock_to_flow(op)

Paramètres:

  • op - L'ensemble de données d'entrée avec interprétation par stock. L'ensemble de données doit avoir un identifiant de type time, des identifiants additionels, et au moins une mesure de type number.

Résultat:

La fonction renvoie un ensemble de données avec la même structure que celui en entrée, mais avec les valeurs converties en flux.

Fonction timeshift

La fonction timeshift décale la composante temporelle d'une plage de temps spécifiée dans l'ensemble de données. Ceci est utile pour analyser des données à différents décalages temporels, par exemple en comparant les valeurs actuelles aux valeurs passées.

Syntaxe:

résultat := timeshift(op, shiftNumber)

Paramètres:

  • op - Ensemble de données contenant des séries chronologiques.
  • shiftNumber - Un entier représentant le nombre de périodes à décaler. Les valeurs positives évoluent dans le temps, tandis que les valeurs négatives reculent.

Résultat:

La fonction renvoie un ensemble de données avec les identifiants temporels décalés du nombre de périodes spécifiées.

Trevas - Java 17

· Une minute de lecture
Nicolas Laval
Making Sense - Developer

Nouveautés

Trevas 1.2.0 permet le support de Java 17.

Gestion des modules Java

Spark ne supporte pas les modules Java.

Les applications clientes en Java 17 embarquant Trevas doivent configurer les UNNAMED modules pour Spark.

Maven

Ajouter à votre fichier pom.xml, dans la section build > plugins :

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<compilerArgs>
<arg>--add-exports</arg>
<arg>java.base/sun.nio.ch=ALL-UNNAMED</arg>
</compilerArgs>
</configuration>
</plugin>

Docker

ENTRYPOINT ["java", "--add-exports", "java.base/sun.nio.ch=ALL-UNNAMED", "mainClass"]

Trevas - Assignements persistants

· Une minute de lecture
Nicolas Laval
Making Sense - Developer

Nouveautés

Trevas 1.2.0 inclut le support des assignements persistants : ds1 <- ds;.

Dans Trevas, les datatsets persistants sont représentés par PersistentDataset.

Gérer PersistentDataset

Les datasets Trevas sont représentés par Dataset.

Après avoir executé le moteur Trevas, vous pouvez utiliser les datasets persistants comme suit :

Bindings engineBindings = engine.getContext().getBindings(ScriptContext.ENGINE_SCOPE);
engineBindings.forEach((k, v) -> {
if (v instanceof PersistentDataset) {
fr.insee.vtl.model.Dataset ds = ((PersistentDataset) v).getDelegate();
if (ds instanceof SparkDataset) {
Dataset<Row> sparkDs = ((SparkDataset) ds).getSparkDataset();
// Do what you want with sparkDs
}
}
});

Trevas - check_hierarchy

· 2 minutes de lecture
Nicolas Laval
Making Sense - Developer

Nouveautés

La validation hiérarchique est implémentée dans Trevas 1.1.0, via les opérateurs define hierarchical ruleset et check_hierarchy.

Exemple

Données en entrée

ds1:

idMe
ABC12
A1
B10
C1
DEF100
E99
F1
HIJ100
H99
I0

Script VTL

// Ensure ds1 metadata definition is good
ds1 := ds1[calc identifier id := id, Me := cast(Me, integer)];

// Define hierarchical ruleset
define hierarchical ruleset hr (variable rule Me) is
My_Rule : ABC = A + B + C errorcode "ABC is not sum of A,B,C" errorlevel 1;
DEF = D + E + F errorcode "DEF is not sum of D,E,F";
HIJ : HIJ = H + I - J errorcode "HIJ is not H + I - J" errorlevel 10
end hierarchical ruleset;

// Check hierarchy
ds_all := check_hierarchy(ds1, hr rule id all);
ds_all_measures := check_hierarchy(ds1, hr rule id always_null all_measures);
ds_invalid := check_hierarchy(ds1, hr rule id always_zero invalid);

Données en sortie

  • ds_all
idruleidbool_varerrorcodeerrorlevelimbalance
ABCMy_Ruletruenullnull0
  • ds_always_null_all_measures
idMeruleidbool_varerrorcodeerrorlevelimbalance
ABC12My_Ruletruenullnull0
DEF100hr_2nullnullnullnull
HIJ100HIJnullnullnullnull
  • ds_invalid
idMeruleiderrorcodeerrorlevelimbalance
HIJ100HIJHIJ is not H + I - J101

Trevas Batch 0.1.1

· Une minute de lecture
Nicolas Laval
Making Sense - Developer

Trevas Batch 0.1.1 utilise la version 1.0.2 de Trevas.

Ce batch Java permet d'obtenir des métriques d'exécutions Trevas en mode Spark.

Le fichier de configuration à renseigner est décrit de le README du projet. Le lancement du batch produiera un fichier Markdown en sortie.

Lancement

Local

java -jar trevas-batch-0.1.1.jar -Dconfig.path="..." -Dreport.path="..."

L'exécution java se fera en Spark local.

Kubernetes

Des objets Kubernetes par défaut sont définis dans le dossier .kubernetes.

Alimenter le fichier config-map.yml puis lancer le job dans votre cluster.

Trevas Jupyter 0.3.2

· Une minute de lecture
Nicolas Laval
Making Sense - Developer

Trevas Jupyter 0.3.2 utilise la version 1.0.2 de Trevas.

Nouveautés

En supplément de la couverture VTL largement augmentée depuis la publication de Trevas 1.x.x, Trevas Jupyter propose 1 nouveau connecteur :

  • fichiers SAS (via la méthode loadSas)

Lancement

Ajout manuel du Kernel Trevas à une instance Jupyter existante

  • Compiler Trevas Jupyter
  • Copier le fichier kernel.json et les dossiers bin et repo dans un nouveau dossier de kernel.
  • Editer le fichier kernel.json
  • Lancer Jupyter

Docker

docker pull inseefrlab/trevas-jupyter:0.3.2
docker run -p 8888:8888 inseefrlab/trevas-jupyter:0.3.2

Helm

L'image docker de Trevas Jupyter peut être instanciée via le contrat Helm jupyter-pyspark de InseeFrLab.

Trevas Lab 0.3.3

· Une minute de lecture
Nicolas Laval
Making Sense - Developer

Trevas Lab 0.3.3 utilise la version 1.0.2 de Trevas.

Nouveautés

En supplément de la couverture VTL largement augmentée depuis la publication de Trevas 1.x.x, Trevas Lab propose 2 nouveaux connecteurs :

  • fichiers SAS
  • JDBC MariaDB

Lancement

Kubernetes

Des exemples d'objet Kubernetes sont disponibles dans les dossiers .kubernetes de Trevas Lab et Trevas Lab UI.