Bypassing Date Filters in Apache Superset Virtual Datasets
En Apache Superset, los conjuntos de datos virtuales a menudo requieren manipulaciones personalizadas de fechas desde los filtros del panel. Los filtros envuelven automáticamente las consultas SQL con condiciones adicionales, rompiendo tu lógica prevista. Aunque el macro remove_filter existía en versiones anteriores a la 5, ya no está disponible. Vamos a ver un caso común: sumar 3 días al valor del filtro from_dttm.
Crea un conjunto de datos virtual con esta consulta:
select * from messages where 1=1 and ts > (TIMESTAMP '{{ from_dttm | default("1970-01-01", true) }}' + INTERVAL '3 days')
Agrega un gráfico "Tabla" al panel con el filtro "Última semana". Superset envuelve la consulta con condiciones como ts >= '...' AND ts < '...', ignorando tu ajuste de +3 días. El filtrado funciona incorrectamente.
Entendiendo el Comportamiento de los Macros de Filtro
Los macros from_dttm y to_dttm devuelven:
None(Python None) si el filtro está vacío.- Una cadena de fecha/hora (por ejemplo,
'2026-03-23 00:00:00') cuando se establece un valor.
Prueba esto simplificando temporalmente la consulta:
select {{from_dttm}} as res
Sin filtro: None. Con filtro: '2026-03-23 00:00:00'. Este es el punto clave: usa default para manejar valores None.
Solución Universal: Enfoque con Columna Falsa
Captura los valores de filtro en variables de Jinja2 con un valor predeterminado, crea una columna falsa de tipo DATETIME. Esta columna se sincroniza con el conjunto de datos y se convierte en base para el filtrado de fechas en el panel.
Consulta 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
Después de guardar:
- Sincroniza los metadatos del conjunto de datos.
- Verifica que
fict_columnsea de tipoDATETIME. - En el panel, configura
fict_columncomo la Columna de Tiempo en el filtro de fechas.
Las condiciones externas de Superset (fict_column >= from_dttm AND fict_column < to_dttm) siempre evaluarán como verdaderas porque from_dttm_fv se extrae directamente del filtro.
Ampliación a to_dttm y Lógica Personalizada
Captura ambos valores de filtro:
{% 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')
Ahora:
- Las condiciones externas sobre
fict_columnsiempre son verdaderas. - La lógica interna aplica el desplazamiento de
+3 díasats. - El filtrado del panel funciona correctamente.
Flujo de Trabajo Estándar
- Define la modificación de fecha necesaria (desplazamiento, redondeo).
- Prueba los macros: confirma el comportamiento con
Noney valores reales. - Crea una columna falsa usando
default. - Sincroniza el conjunto de datos y verifica que el tipo sea
DATETIME. - Configura el filtro del panel para usar
fict_column. - Aplica la lógica personalizada en la cláusula
WHERE. - Valida los resultados en el panel.
Conclusiones Clave
- La columna falsa es obligatoria: asegura que las condiciones externas de Superset sigan siendo verdaderas.
- El
defaultparaNonees crítico:1970-01-01 00:00:00evita errores en tiempo de ejecución. - Usa el casting
::TIMESTAMP: garantiza el tipoDATETIMEcorrecto en los metadatos. - Sincroniza los metadatos: sin esto, la columna no aparecerá en los filtros.
- Solución universal: funciona para cualquier manipulación de fechas en
from_dttmoto_dttm.
Este método te da control total sobre el manejo de fechas en conjuntos de datos virtuales sin conflictos con los filtros del panel.
— Editorial Team
Aún no hay comentarios.