Фильтры в Apache Superset. Кросс-фильтрация

от автора

Сегодня разберемся, что такое кросс-фильтрация в Apache Superset и какую неожиданную опасность она может нести.

Помимо классических фильтров, позволяющих пользователю вводить/выбирать нужные значения, существуют также и кросс-фильтры. Они позволяют связывать виджеты на дашборде без использования фильтров. Проще взглянуть на пример классического для Apache Superset дашборда COVID Vaccine Dashboard:

В данном примере пользователь нажал (и вот как правило случайно) на ячейку пирога, и у бар-чарта автоматически перестроился график.

Механизм очень простой:

  • пользователь нажал на ячейку

  • суперсет запомнил, что пользователь выделил, на уровне датасета. Проще представить, что он перевел это в классический SQL-фильтр. В данном случае это WHERE stage_of_development in (‘2. Phase II or Combined I/II’)

  • затем во всех виджетах на дашборде (на конкретном листе, в данном случае он один) он пытается этот фильтр применить. Для этого он лезет в датасет каждого виджета и, если в нем есть колонка stage_of_development, добавляет условие WHERE stage_of_development in (‘2. Phase II or Combined I/II’). Работает это именно по имени колонки.

Вот, что добавилось в формирование датасета, который перестроился после действий пользователя:

Да, он привез кучу всего, но на самом деле это просто копипаст логики из чарта пирога, один в один.

Полезный ли это механизм? Ну, наверно да, ведь он позволяет не делать 100500 фильтров, а вот так просто на чистом UI реализовать фильтрацию. Но это несет в себе и недостатки.

Пользователь просто не знает про этот механизм

Представьте, что вы делали дашборд для человека, который далек от IT. И уж тем более от приколов суперсета. Ну, например, для ГД. Весьма занятого человека с кучей встреч, миллионом задач, диким стрессом и высочайшим уровнем ответственности. Одним словом — этому человеку абсолютно индифферентно (синоним подберете) на какую-то там суперсетовскую кросс-фильтрацию. Да и на того, кто этот дашборд делал. Ему просто срочно нужен отчет для важной встречи.

И вот в момент изучения цифр дашборда ГД, не зная про кросс-фильтры, нечаянно жамкнул на ячейку пирога. Все чарты, у которых в датасете есть колонка stage_of_development, перестроились. Откуда не знающему человеку знать, что произошло? Так и должно быть? А если он просто жамкнул и даже не заметил, что что-то произошло, ведь не всегда все чарты умещаются в экран?

Да, далеко за примером ходить не нужно, просто пролистаем ниже этот дашборд и взглянем на то, что нужно увидеть пользователю для того, чтобы понять, что к виджету применены какие-то фильтры:

Пользователь явно будет огорчен, ведь даже текст мелким шрифтом на последнем листе ипотечного договора более читабелен, чем это.

Но постойте, а откуда там циферка 2? Мы же жамкнули всего один раз на ячейку пирога?

Количество кросс-фильтров не ограничено

Это был небольшой спойлер ко второй проблеме — количество кросс-фильтров не ограничено ничем и никак. Можно тыкнуть — можно и фильтр прокинуть. И даже если на этот виджет ты уже «тыкал», то при «тыке» на другой виджет с него пробросится фильтр на тот виджет, на который ты уже тыкал!

Да, все работает именно так, как на картинке. Без лишних слов, идем чинить проблему

Сброс всех кросс-фильтров

Представьте, что в процессе аналитики/истерики пользователь натыкал на дашборде несколько кросс-фильтров. Как их все найти? Неужели лазать по всем чартам и искать с куклой-вуду где там и что натыкано? — нет, к счастью.

Хорошая новость в том, что все кросс-фильтры собраны там же, где и обычные фильтры. Плохая же новость в том, что нет кнопки «удалить все» (хотя в последних версиях мб и завезли, не проверял). В общем, удаляем все, что тут есть, и продолжаем работать с дашбордом.

Отключаем кросс-фильтрацию

Если же хочется избежать этих невзгод вообще, то можно отключить кросс-фильтрацию.

  • Способ 1: радикальный. Отключаем кросс-фильтрацию в принципе как опцию. Для этого в конфиг в переменную FEATURE_FLAGS вносим запись «DASHBOARD_CROSS_FILTERS»: True

  • Способ 2: умеренный. Отключаем кросс-фильтрацию для конкретного дашборда. Делается в том же меню, где и сброс кросс-фильтров (убираем галочку, и кросс-фильтрация отключается):

Заключение:

Сегодня мы познакомились со включенной по умолчанию и, казалось бы, полезной и безобидной функцией кросс-фильтров в Apache Superset. Но, если применить фантазию и щепотку любопытства, то окажется, что она может принести много вреда.

Конечно же, это далеко не единственный «казус». Если хотите знать Apache Superset без сюрпризов — добро пожаловать на курс автора статьи. По промокоду HABR_BEST предоставляется скидка 30% — Apache Superset: полный курс

ссылка на оригинал статьи https://habr.com/ru/articles/1050692/