> For the complete documentation index, see [llms.txt](https://cleyrop.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cleyrop.gitbook.io/docs/v-4.5/projet-data-and-ia/dataflow/creer-un-dataflow/configurer-un-dataset-de-sortie.md).

# Configurer un Dataset de sortie

## Configurer les méta-données

Pour les transformations, vous pouvez configurer les informations du Dataset de sortie :

* **Nom**
* **Description**
* **Responsable**
* **Sensibilité** :
  * Si le dataset est issu d'au moins un Dataset d'entrée, le Dataset de sortie aura la sensibilité maximale de ses parents
  * Sinon vous pourrez choisir son niveau de sensibilité. Dans ce cas, elle ne sera pas modifiable après mise en production
* **Classification** : bronze, silver, gold
* **Labels** : les labels sont des mots-clés libres que vous pouvez associer à un dataset pour faciliter sa recherche et son organisation dans la bibliothèque et le catalogue. Vous pouvez choisir un label dans la liste de ceux existant ou en rajouter un en l'écrivant. Vous pouvez gérer les labels en cliquant sur les ... à côté du nom d'un label
* **Mode de rafraîchissement**
  * *replace* → les anciennes données sont remplacées
  * *append* → les nouvelles données sont ajoutées

{% hint style="warning" %}
Le **mode de rafraîchissemen**t n'est pas modifiable après la première exécution de la transformation parent.

**Lors d'un rafraichissement, la politique de schéma appliquée est la&#x20;*****fusion de schémas*****. Concrètement :**

* **Correspondance des colonnes existantes :**\
  Les colonnes portant le *même nom* que celles du schéma du Dataset doivent également avoir le *même type* ➝ *Si le type ne correspond pas, le fichier est rejeté.*
* **Colonnes supplémentaires ou manquantes :**\
  Des colonnes en plus ou en moins sont autorisées ➝ *Les colonnes manquantes seront simplement renseignées avec des valeurs vides.*
  {% endhint %}

### Ajouter des descriptions aux colonnes

Chaque colonne d'un dataset peut être documentée avec une description textuelle pour expliquer sa signification métier, sa logique de transformation ou ses contraintes particulières.

Pour les datasets issus de Dataflow, les descriptions peuvent être éditées en mode Brouillon. Une fois le Dataflow en production, elles ne peuvent être modifiées que depuis la fiche dataset après le merge en production, et non dans les branches de développement.

## Référencer le dataset dans la bibliothèque

Par défaut, un dataset de sortie n'est pas visible dans la bibliothèque du projet. Vous pouvez choisir explicitement de le référencer pour le rendre disponible à d'autres utilisateurs.

Le bouton **Référencer** est accessible :

* directement depuis le graphe du Dataflow, au-dessus du dataset de sortie,
* ou depuis la fiche de détail du dataset de sortie.

Le dataset référencé apparaît dans la bibliothèque une fois le Dataflow déployé en production.

{% hint style="warning" %}
Cette action est irréversible
{% endhint %}

## Réinitialiser les données

Il est possible de remettre à zéro les données d’un dataset sans supprimer son schéma, uniquement lorsqu’il est manipulé via un Dataflow en brouillon ou une branche. Cette fonction est particulièrement utile lorsque vous itérez sur une transformation ayant un Dataset de sortie en mode *Append*

**Comment réaliser cette action**

* Allez dans la branche du Dataflow → cliquez sur le Dataset à réinitialiser
* Un bouton <i class="fa-arrows-rotate-reverse">:arrows-rotate-reverse:</i> Réinitialiser les données apparaît au dessus du Dataset

À validation

* Un script d’effacement est exécuté (PySpark ou Python selon le cluster).
* Les données sont supprimées sans toucher au schéma.
* Un retour d’état est affiché dans les logs d’exécution du Dataflow.

#### Restrictions

* Impossible de réinitialiser un **dataset déployé en production**.
* Impossible depuis la fiche dataset seule : l’action est uniquement disponible dans le Dataflow.
* Le responsable de la branche est le seul habilité à effectuer l’action.

## Gérer le schéma du dataset de sortie

Le schéma d’un dataset (colonnes et types) est **commun à toutes les branches d’un même Dataflow**.

* Une fois qu’une colonne est créée, **son type ne peut plus être modifié** sans supprimer la colonne ou le dataset.
* Le schéma agit comme un **contrat de structure partagé :** toutes les branches doivent conserver la même définition pour une même colonne.
* Si une **colonne doit évoluer** (ex. int → string), vous devez soit supprimer la colonne, soit créer un nouveau dataset avec le type correct.

{% hint style="info" %}
Il peut exister des **colonnes locales** au sein d’une branche, mais elles héritent toutes du même schéma global du dataset.
{% endhint %}

Certaines bibliothèques (Pandas, Spark, Polars) n’ont pas les mêmes conventions de typage.

### Types supportés et compatibilité schéma

<table><thead><tr><th width="112.55078125">Type Cleyrop</th><th width="107.2734375">Pandas</th><th>Pandas-on-Spark</th><th width="122.5390625">Spark SQL</th><th width="95.44921875">Polars</th><th>Remarques</th></tr></thead><tbody><tr><td><p>Integer</p><p>Entier</p></td><td>int64</td><td>LongType</td><td>LongType</td><td>Int64</td><td>Compatible tant que pas de valeurs nulles (préférer nullable types).</td></tr><tr><td><p>Double</p><p>Décimal</p></td><td>float64</td><td>DoubleType</td><td>DoubleType</td><td>Float64</td><td>Attention aux conversions implicites (arrondis).</td></tr><tr><td>Booléen</td><td>bool</td><td>BooleanType</td><td>BooleanType</td><td>Boolean</td><td>⚠️ None dans Pandas peut devenir null non supporté dans Spark sans cast.</td></tr><tr><td><p>String</p><p>Chaîne de caractères</p></td><td>object ou string</td><td>StringType</td><td>StringType</td><td>Utf8</td><td>Préférer string (pandas >= 1.5) pour compatibilité.</td></tr><tr><td>Date</td><td>datetime64[ns]</td><td>TimestampType</td><td>TimestampType</td><td>Datetime</td><td>Les fuseaux horaires peuvent différer, cast explicite recommandé.</td></tr></tbody></table>

### Supprimer une colonne <a href="#creer-un-dataset-depuis-un-dataframe-pandas-version-polars" id="creer-un-dataset-depuis-un-dataframe-pandas-version-polars"></a>

Lors de la préparation d’un dataset de sortie, il est fréquent de vouloir retirer une colonne inutile (ex : erreur de manipulation, colonne vide, test, attribut obsolète).

Cette action supprime de façon irréversible la colonne du schéma et les données associées.

**Comment réaliser cette action**

* Allez dans le Dataflow → panel de prévisualisation du dataset de sortie.
* Un bouton <i class="fa-circle-trash">:circle-trash:</i> Supprimer apparaît pour chaque colonne.
* Sélectionnez la colonne souhaitée et confirmez

{% hint style="warning" %}
Il est possible de supprimer une colonne dans le schéma si :

* Le Dataflow est en mode **brouillon**
* Après la mise en production, possible dans une **branche** du Dataflow uniquement **si la colonne n'est pas** **dans le schéma du `main`**
  {% endhint %}

#### Restrictions

Ces règles sont importantes pour assurer la cohérence et la sécurité des données.

| Contrainte                                                                | Détail                                                                         |
| ------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| Impossible de supprimer une colonne d’un dataset de sortie en production  | Les datasets en production sont immuables.                                     |
| Impossible de supprimer une colonne présente dans le dataset main déployé | Même si vous êtes dans une branche.                                            |
| Impossible de supprimer la **dernière colonne** d’un dataset              | Limitation du format Iceberg.                                                  |
| Suppression possible dans n’importe quelle branche                        | Mais uniquement par le responsable du dataset (créateur ou responsable du DF). |

En cas d’erreur (colonne intouchable ou dernière colonne), une popup explicative informe l’utilisateur.

### Mapping des types de colonnes <a href="#creer-un-dataset-depuis-un-dataframe-pandas-version-polars" id="creer-un-dataset-depuis-un-dataframe-pandas-version-polars"></a>

#### Pandas <> Pyspark <a href="#creer-un-dataset-depuis-un-dataframe-pandas-version-pyspark" id="creer-un-dataset-depuis-un-dataframe-pandas-version-pyspark"></a>

Vous pouvez créer un dataframe PySpark Pandas à partir d'un dataframe Pandas avec la fonction : `ps.from_pandas(pdf)`.

Attention, l'utilisation de cette fonction peut amener à des problèmes de type de colonne qui ne seront pas les mêmes entre le dataframe Pandas et Pyspark Pandas.

Afin d'être sûr de retrouver le même dataframe à la suite de la conversion nous vous conseillons d'utiliser le code :

{% code title="column type mapping between pandas and pyspark pandas" %}

```python
df = <votre-dataframe-pandas>

def map_pandas_dtype_to_spark(pandas_dtype):
    if pd.api.types.is_string_dtype(pandas_dtype):
        return 'string'
    elif pd.api.types.is_numeric_dtype(pandas_dtype):
        if pd.api.types.is_integer_dtype(pandas_dtype):
            return 'int'
        elif pd.api.types.is_float_dtype(pandas_dtype):
            return 'float'
    elif pd.api.types.is_datetime64_any_dtype(pandas_dtype):
        return 'datetime64[ns]'
    else:
        return 'string'

# Obtenir les types de colonnes pour le schéma Spark
column_types = {col: map_pandas_dtype_to_spark(df[col].dtype) for col in df.columns}


# Convertir un DataFrame Pandas en DataFrame Spark avec les types de colonnes spécifiés
psdf = ps.DataFrame(data=df.to_dict(), columns=df.columns, dtype=str).astype(column_types)
```

{% endcode %}

#### Pandas <> Polars

Vous pouvez créer un Lazyframe Polars (qui sera automatiquement transformé en DataFrame à l'exécution de la transformation) à partir d'un dataframe Pandas avec la fonction : `polars.from_pandas(dataframe).lazy()`. ([documentation polars](https://docs.pola.rs/api/python/stable/reference/api/polars.from_pandas.html))

Attention, l'utilisation de cette fonction peut amener à des problèmes de type de colonne qui ne seront pas les mêmes entre le dataframe Pandas et Polars.

Afin d'être sûr de retrouver le même dataframe à la suite de la conversion nous vous conseillons d'utiliser le code :

{% code title="column type mapping between pandas and polars" %}

```python
df = <votre-dataframe-pandas>

def map_pandas_dtype_to_polars(pandas_dtype):
    if pd.api.types.is_string_dtype(pandas_dtype):
        return polars.String
    elif pd.api.types.is_numeric_dtype(pandas_dtype):
        if pd.api.types.is_integer_dtype(pandas_dtype):
            return polars.Int64
        elif pd.api.types.is_float_dtype(pandas_dtype):
            return polars.Float64
    elif pd.api.types.is_datetime64_any_dtype(pandas_dtype):
        return polars.Datetime("ns")
    else:
        return polars.String

# Obtenir les types de colonnes pour le schéma Polars
schema_overrides = {col: map_pandas_dtype_to_polars(df[col].dtype) for col in df.columns}


# Convertir un DataFrame Pandas en DataFrame Polars avec les types de colonnes spécifiés
lf = polars.from_pandas(df, schema_overrides=schema_overrides, nan_to_null=True, rechunk=True,).lazy()
```

{% endcode %}

## Bonnes pratiques

* Préférez des **types explicites** (string, int64, float64) pour éviter les auto-conversions.
* Assurez-vous que le schéma de sortie est correct et cohérent avec les autres branches.
