홈으로 돌아가기

Superset의 날짜 필터: 래퍼 우회

이 기사는 Apache Superset 가상 데이터셋에서 자동 날짜 필터 래퍼를 우회하는 해킹을 설명합니다. 더미 DATETIME 컬럼을 사용하여 Jinja2를 통해 from_dttm/to_dttm을 가로챕니다. 이 접근 방식은 충돌 없이 올바른 날짜 사용자 지정을 보장합니다.

Superset의 날짜 필터 해킹: 오류 없이 +3일
Advertisement 728x90

Apache Superset 가상 데이터셋에서 날짜 필터 회피 기법

Apache Superset에서 가상 데이터셋은 대시보드 필터로부터 맞춤형 날짜 조작이 자주 필요합니다. 하지만 필터는 SQL 쿼리를 자동으로 추가 조건으로 감싸기 때문에 의도한 로직이 깨질 수 있습니다. 5버전 이전에는 remove_filter 매크로가 있었지만, 현재는 더 이상 사용할 수 없습니다. 이번에 살펴볼 일반적인 사례는 from_dttm 필터 값에 3일을 더하는 것입니다.

다음과 같은 쿼리로 가상 데이터셋을 생성하세요:

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

"최근 1주일" 필터를 포함한 "테이블" 차트를 대시보드에 추가해 보세요. Superset은 쿼리에 ts >= '...' AND ts < '...'와 같은 조건을 자동으로 추가하여, +3 days 조정을 무시하게 됩니다. 결과적으로 필터링이 제대로 작동하지 않습니다.

Google AdInline article slot

필터 매크로 동작 이해하기

from_dttmto_dttm 매크로는 다음과 같이 반환됩니다:

  • 필터가 비어 있을 경우: None (파이썬의 None)
  • 값이 설정되어 있을 경우: 타임스탬프 문자열 (예: '2026-03-23 00:00:00')

일시적으로 쿼리를 단순화해서 테스트해 보세요:

select {{from_dttm}} as res

필터 없이 실행하면 None, 필터가 있으면 '2026-03-23 00:00:00'이 출력됩니다. 핵심은 default를 사용해 None 값을 처리하는 것입니다.

Google AdInline article slot

유니버설 해법: 가짜 컬럼 접근법

Jinja2 변수에 필터 값을 저장하고 기본값을 설정한 후, 가짜 DATETIME 컬럼을 만들어 데이터셋과 동기화합니다. 이 컬럼은 대시보드 날짜 필터의 기준이 됩니다.

기본 쿼리:

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

저장 후 다음 단계를 수행하세요:

Google AdInline article slot
  • 데이터셋 메타데이터를 동기화합니다.
  • fict_columnDATETIME 타입인지 확인합니다.
  • 대시보드에서 fict_column시간 열로 설정합니다.

Superset의 외부 조건 (fict_column >= from_dttm AND fict_column < to_dttm)은 항상 참이 되며, 이는 from_dttm_fv가 필터에서 직접 가져오기 때문입니다.

to_dttm 및 맞춤 논리 확장하기

두 필터 값을 모두 저장하세요:

{% 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')

이제 다음과 같은 효과를 얻을 수 있습니다:

  • fict_column에 대한 외부 조건은 항상 참입니다.
  • 내부 로직에서는 ts+3일 조정이 적용됩니다.
  • 대시보드 필터링이 정상적으로 작동합니다.

일반적인 설정 워크플로우

  • 필요한 날짜 수정 방식(이동, 반올림 등)을 정의합니다.
  • 매크로 테스트: None과 실제 값에서의 동작을 확인합니다.
  • default를 사용해 가짜 컬럼을 생성합니다.
  • 데이터셋을 동기화하고 DATETIME 타입을 확인합니다.
  • 대시보드 필터에서 fict_column을 사용하도록 설정합니다.
  • WHERE 절에 맞춤 논리를 적용합니다.
  • 대시보드에서 결과를 검증합니다.

핵심 요약

  • 가짜 컬럼은 필수: Superset의 외부 조건이 항상 참이 되도록 보장합니다.
  • None에 대한 기본값은 중요: 1970-01-01 00:00:00은 런타임 오류를 방지합니다.
  • ::TIMESTAMP 형변환 사용: 메타데이터에서 올바른 DATETIME 타입을 보장합니다.
  • 메타데이터 동기화 필수: 그렇지 않으면 컬럼이 필터에 나타나지 않습니다.
  • 유니버설 해결책: from_dttm 또는 to_dttm에 대한 어떤 날짜 조작에도 적용 가능합니다.

이 방법을 통해 대시보드 필터와 충돌 없이 가상 데이터셋의 날짜 처리를 완전히 제어할 수 있습니다.

— Editorial Team

Advertisement 728x90

다음 읽기