Obcházení filtrů dle data ve virtuálních datových sadách Apache Superset
V Apache Superset se často vyžaduje přizpůsobení dat z filtrů na dashboardu u virtuálních datových sad. Filtry automaticky obalují SQL dotazy dalšími podmínkami, což narušuje logiku. V verzích před 5 byl k dispozici makro remove_filter, ale nyní již neexistuje. Uvažujme případ: je třeba přidat 3 dny k datu z filtru from_dttm.
Vytvoříme virtuální datovou sadu:
select * from messages where 1=1 and ts > (TIMESTAMP '{{ from_dttm | default("1970-01-01", true) }}' + INTERVAL '3 days')
Přidáme graf "tabulka" na dashboard s filtrem "poslední týden". Superset obalí dotaz podmínkami typu ts >= '...' AND ts < '...', ignoruje tak naše upravení o +3 dny. Filtrování funguje špatně.
Analýza chování filtrů
Makra from_dttm a to_dttm vrací:
- None (Python None), pokud je filtr prázdný.
- Řetězec s datem ve formátu TIMESTAMP, pokud je hodnota zadána.
Ověříme to, dočasně zjednodušením dotazu:
select {{from_dttm}} as res
Bez filtru: None. S filtrem: '2026-03-23 00:00:00'. To je klíč k řešení – použijeme default pro hodnotu None.
Univerzální trik: fiktivní sloupec
Zachytíme hodnoty filtrů do Jinja2 proměnných s výchozí hodnotou, vytvoříme fiktivní sloupec DATETIME. Ten se synchronizuje do datové sady a používá se v filtrech na dashboardu.
Základní dotaz:
{% set from_dttm_fv = from_dttm | default("1970-01-01 00:00:00", true) %} SELECT *, '{{ from_dttm_fv }}'::TIMESTAMP as fict_column FROM messages
Po uložení:
- Synchronizujte metadata datové sady.
- Ověřte typ sloupce
fict_column– musí být DATETIME. - Na dashboardu nastavte
fict_columnjako časový sloupec ve filtru dle data.
Externí podmínky Superset (fict_column >= from_dttm AND fict_column < to_dttm) jsou vždy splněny, protože from_dttm_fv pochází z filtru.
Rozšíření pro to_dttm a vlastní úpravy
Zachytíme obě hodnoty:
{% 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')
Nyní:
- Externí podmínky pro
fict_columnjsou splněny. - Vnitřní logika aplikuje posun o +3 dny na
ts. - Filtrování na dashboardu funguje správně.
Typický postup konfigurace
- Určete požadovanou úpravu data (posun, zaokrouhlení).
- Otestujte makra: ověřte hodnotu None i reálné hodnoty.
- Vytvořte fiktivní sloupec s
default. - Synchronizujte datovou sadu, ověřte typ DATETIME.
- Nastavte filtr na
fict_column. - Použijte vlastní logiku v
WHERE. - Ověřte funkčnost na dashboardu.
Co je důležité
- Fiktivní sloupec je povinný: zajistí pravdivost externích podmínek Superset.
- Default pro None je kritický:
'1970-01-01 00:00:00'zabrání chybám. - Převod na TIMESTAMP: zajišťuje typ DATETIME v metadatach.
- Synchronizace metadata: bez ní sloupec není viditelný v filtrech.
- Univerzalita: funguje pro jakékoli úpravy
from_dttm/to_dttm.
Tento přístup umožňuje plnou kontrolu nad daty ve virtuálních datových sadách bez konfliktu s filtry na dashboardu.
— Editorial Team
Zatím žádné komentáře.