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.
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.
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 :
- Synchronisez les métadonnées du jeu de données.
- Vérifiez que
fict_columnest bien de typeDATETIME. - Dans le tableau de bord, définissez
fict_columncomme 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_columnsont 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
Noneet 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
defaultpourNoneest crucial :1970-01-01 00:00:00évite les erreurs à l’exécution. - Utilisez le cast
::TIMESTAMP: assure le bon typeDATETIMEdans 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_dttmouto_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
Aucun commentaire pour le moment.