Apache Superset: от данных до дашборда
Часто для людей Apache Superset (Суперсет) — open-source альтернатива Tableau (Табло). И когда переходишь из Табло в Суперсет и изучаешь информацию по Суперсету, всё кажется очень сложным и не дружелюбным. Схема того, как это всё работает выглядит примерно так:

Много всяких взаимосвязей, какая-то Jinja, для чего-то CSS и какой-то конфиг. В общем, выглядит сложно.
Схему я на самом деле переусложнил и попытался показать это так, как видел в самом начале знакомства с Суперсетом.
До этого я уже рассказывал про наш опыт переезда из Табло в Суперсет. В статье мы выяснили, что для погружения в любой BI инструмент важно научиться отвечать на следующие вопросы:
- Как загрузить данные?
- Как нарисовать график?
- Как задать стиль графику?
- Как расположить график на дашборд?
- Как настроить взаимодействие пользователя с дашбордом?
- Как задать стиль дашборду?
Чтобы понять, как сущности на картинке выше соотносятся с вопросами, ответы на которые нам нужно получить, выстроим всё это в одну линию: от базы до дашборда.
1. Как загрузить данные?
В отличие от Табло в Суперсете нет системы экстрактов. Дашборды всегда работают в Live режиме. Поэтому ответ на вопрос: как загрузить данные в Superset? Никак.

Поэтому почти всегда вопрос: «как что-то сделать в Суперсет?», например, посчитать метрику плавающим окном, превращается в: «как в моей базе данных написать запрос, который считает метрику плавающим окном?».
Но я чуть забегаю тут вперёд, подробнее дальше.
В Суперсете есть сущность датасета. Что это такое и для чего она нужна?

2.1. Датасет хранит столбцы и логику
Датасет в первую очередь проводник мета-информации о таблице: название, столбцы и их типы данных.
Всю эту мета-информацию можно обогащать:
- Пользовательские метрики. Это любые агрегатные выражения, которые потом отрисовываются на графиках.
- Вычисляемые поля. Любые преображения данных, в которые зашивается какая-то дополнительная логика.
Метрики и вычисляемые поля сущности не обязательные и служат исключительно для нашего удобства.

После их добавления появляется возможность добавить их на график
и построить нашу первую визуализацию:

Так как наш первый график готов, самое время расположить его на дашборд:

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

С базовым функционалом мы разобрались. Следующий этап — настроить более сложную логику для взаимодействия пользователя с дашбордом. Здесь из-за кустов выходит та самая Jinja.
2.2. Jinja как способ сформировать логику
Лично для меня первое знакомство с Jinja (Джинжа) выглядело отталкивающим. Куча скобок, какие знаки вопроса, какие-то функции, что вообще происходит, зачем так сложно и вообще для чего, помогите?

В примере выше наглядное применение Jinja шаблонов:
- Пользователь меняет временной срез. Меняется форматирование оси Х и период, за который выводится график.
- Пользователь меняет группировку. Меняется то, в какой разбивке показывается график.

Теперь давайте углубимся и поймём, что это такое.
Джинжа — шаблонизатор, написанный на Python (как и бэкенд Суперсета) и приближенный к его синтаксису. Поэтому если вы знакомы с этим языком программирования, то вам будет легко понимать, что вообще проихсодит
в шаблонах.
Шаблонизатор направлен на работу с текстом. В нашем случае для 99% задач — помощь в генерации SQL.
Cамый простой пример шаблона в Python — форматирование строк:

По сути это прокачанные f-строки из Питона, в которых реально много возможностей. Давайте взглянем на неё чуть подробнее, чтобы понять, как это работает и как мы можем этим управлять.

Условная схема работы шаблонизатора такая:
- Есть шаблон
- Есть внешние данные
- Всё это обрабатывается программой (Джинжа)
- Выводится финальный результат
Разберём эту схему на конкретном примере работы в Суперсете:
- Шаблон — вычисляемое поле dynamic_date для Оси Х.

2. Внешние данные — фильтр, проброшенный из дашборда.

В нашем случае на дашборде был выбран фильтр "Квартал", он передался в график, мы видим его в разделе Filters. И результатом работы шаблонизатора стал SQL код, содержащий выражение в ветке
{% elif filter_values('dimension')|first == 'Квартал' %}
to_char(order_date, 'YYYY "Q"Q')
Это даёт очень широкие возможности для кастомизации запросов и позволяет настроить для пользователя практически любую интерактивность работы дашборда.
3. Откуда данные в графике?
Теперь заглянем внутрь и поймём каким образом получается график.
Так как мы работаем на Live подключении, каждое обновление графика — запрос в базу данных, а все пилюли, что мы перетаскиваем при формирования графика — куски SQL кода, и то в какую часть запроса наше выражение отправится зависит от раздела (X-Axis, Metrics, Dimensions, Filters, Sort By, Row Limit), в который мы поле кладём.

Для того, чтобы лучше в этом разобраться, рекомендую поэкспериментировать с полями и посмотреть, как это влияет на SQL запрос, который пойдёт в базу. После этого любые вопросы относительно возможностей реализации каких-то расчётов скорее всего отпадут.

4. База отдаёт данные
По итогу сформированный запрос идёт в базу и база отдаёт нам данные, которые Superset уже интерпретирует и отрисовывает.

5. График кастомизирует изображение
Дальше с полученными графиком можно поиграться, настроив всякие мелкие улучшения. На данные это не повлияет, только на визуал. К сожалению, в Superset по умолчанию не так много возможностей для кастомизации.


6. Кастомизация на дашборде
Это последний этап, на котором проявляются конфиги дашборда и CSS.
Благодаря ним можно изменить отображение и стили на самом дашборде. Как правило мы убираем лишнее: отступы, заголовки, линии. Всё для того, чтобы финальный продукт стал чище читался лучше.

Также с дашборда можно кастомизировать внешнюю часть графиков.
Отвечаем на вопросы
Мы разобрали практически весь функционал Superset и теперь готовы к ответу на вопросы:
- Как загрузить данные?
- Никак. Данные подгружаются динамически из SQL запроса, который вы задаёте в редакторе графика.
- Как нарисовать график?
- Подключить датасет с нужной таблицей, расположить нужные элементы в редакторе графика.
- Как задать стиль графику?
- Во вкладке кастомизация редактора графика, на дашборде через CSS.
- Как расположить график на дашборд?
- Создать график. Создать дашборд. В редактировании дашборда расположить нужный график.
- Как настроить взаимодействие пользователя с дашбордом?
- С помощью фильтров на дашборде и Jinja в графиках для отработки логики.
- Как задать стиль дашборду?
- Через CSS на дашборде
Итого
Superset — хороший инструмент с очень большим количеством возможностей для кастомизации. Из-за такого количества возможностей, много чего перекладывается на разработчика и даётся ему в виде написания кода.
С одной стороны это открывает большие возможности, с другой стороны нужно этим аккуратно пользоваться, чтобы не перекастомизировать дашборд или сделать это без понимания важных принципов визуализации.