Zpět na domů

Filtry podle data v Superset: obcházení obálky

Článek popisuje hack pro obcházení automatického obalování filtry podle data ve virtuálních datových sadách Apache Superset. Používá se fiktivní sloupec DATETIME s zachycením from_dttm/to_dttm prostřednictvím Jinja2. Přístup zajišťuje správné přizpůsobení dat bez konfliktů.

Hack filtrů data v Superset: +3 dny bez chyb
Advertisement 728x90

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ě.

Google AdInline article slot

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.

Google AdInline article slot

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í:

Google AdInline article slot
  • Synchronizujte metadata datové sady.
  • Ověřte typ sloupce fict_column – musí být DATETIME.
  • Na dashboardu nastavte fict_column jako č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_column jsou 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

Advertisement 728x90

Číst dál