Retour à l'accueil

Filtres de date dans Superset : contournement de l'enveloppe

L'article décrit une astuce pour contourner l'enveloppe automatique des filtres de date dans les datasets virtuels Apache Superset. Une colonne DATETIME fictive est utilisée pour intercepter from_dttm/to_dttm via Jinja2. L'approche garantit une personnalisation correcte des dates sans conflits.

Astuce filtres de date dans Superset : +3 jours sans erreurs
Advertisement 728x90

Contourner les filtres de date dans les jeux de données virtuels Apache Superset

Dans Apache Superset, les jeux de données virtuels nécessitent souvent des manipulations personnalisées de dates à partir des filtres du tableau de bord. Les filtres enveloppent automatiquement les requêtes SQL avec des conditions supplémentaires, ce qui perturbe votre logique initiale. Bien que la macro remove_filter existait auparavant (avant la version 5), elle n'est plus disponible. Explorons un cas d'utilisation courant : ajouter 3 jours à la valeur du filtre from_dttm.

Créez un jeu de données virtuel avec cette requête :

select *   from messages   where 1=1   and ts > (TIMESTAMP '{{ from_dttm | default("1970-01-01", true) }}' + INTERVAL '3 days')

Ajoutez un graphique "Table" au tableau de bord avec le filtre "La semaine dernière". Superset enveloppe la requête avec des conditions comme ts >= '...' AND ts < '...', ignorant ainsi votre ajustement de +3 jours. Le filtrage se comporte de manière incorrecte.

Google AdInline article slot

Comprendre le comportement des macros de filtre

Les macros from_dttm et to_dttm renvoient :

  • None (valeur Python None) si le filtre est vide.
  • Une chaîne de timestamp (ex. '2026-03-23 00:00:00') lorsqu'une valeur est définie.

Testez cela en simplifiant temporairement la requête :

select {{from_dttm}} as res

Sans filtre : None. Avec filtre : '2026-03-23 00:00:00'. C’est là que réside la clé — utilisez default pour gérer les valeurs None.

Google AdInline article slot

Astuce universelle : approche par colonne fantôme

Capturez les valeurs de filtre dans des variables Jinja2 avec une valeur par défaut, créez une colonne DATETIME fictive. Cette colonne sera synchronisée avec l’ensemble de données et servira de base au filtrage de date dans le tableau de bord.

Requête de base :

{% set from_dttm_fv = from_dttm | default("1970-01-01 00:00:00", true) %}   SELECT *, '{{ from_dttm_fv }}'::TIMESTAMP as fict_column   FROM messages

Après sauvegarde :

Google AdInline article slot
  • Synchronisez les métadonnées du jeu de données.
  • Vérifiez que fict_column est bien de type DATETIME.
  • Dans le tableau de bord, définissez fict_column comme Colonne de temps dans le filtre de date.

Les conditions externes de Superset (fict_column >= from_dttm AND fict_column < to_dttm) seront toujours vraies, car from_dttm_fv est directement extraite du filtre.

Extension à to_dttm et logique personnalisée

Capturez les deux valeurs de filtre :

{% set from_dttm_fv = from_dttm | default("1970-01-01 00:00:00", true) %}   {% set to_dttm_fv = to_dttm | default("1970-01-01 00:00:00", true) %}   SELECT *   , '{{ from_dttm_fv }}'::TIMESTAMP as fict_column   FROM messages   WHERE ts > (TIMESTAMP '{{ from_dttm_fv }}' + INTERVAL '3 days')   and ts < (TIMESTAMP '{{ to_dttm_fv }}' + INTERVAL '3 days')

Maintenant :

  • Les conditions externes sur fict_column sont toujours vraies.
  • La logique interne applique le décalage de +3 jours à ts.
  • Le filtrage du tableau de bord fonctionne correctement.

Workflow typique de configuration

  • Définissez la modification de date nécessaire (décalage, arrondi).
  • Testez les macros : vérifiez le comportement avec None et des valeurs réelles.
  • Créez une colonne fantôme en utilisant default.
  • Synchronisez le jeu de données et confirmez le type DATETIME.
  • Configurez le filtre du tableau de bord pour utiliser fict_column.
  • Appliquez la logique personnalisée dans la clause WHERE.
  • Validez les résultats sur le tableau de bord.

Points clés à retenir

  • La colonne fantôme est obligatoire : elle garantit que les conditions externes de Superset restent vraies.
  • Le default pour None est crucial : 1970-01-01 00:00:00 évite les erreurs à l’exécution.
  • Utilisez le cast ::TIMESTAMP : assure le bon type DATETIME dans les métadonnées.
  • Synchronisez les métadonnées : sans cela, la colonne n’apparaît pas dans les filtres.
  • Solution universelle : fonctionne pour toute manipulation de date sur from_dttm ou to_dttm.

Cette méthode donne un contrôle total sur la gestion des dates dans les jeux de données virtuels, sans conflit avec les filtres du tableau de bord.

— Editorial Team

Advertisement 728x90

Lire ensuite