Найти в Дзене
Трофим Воробьев

Apache Superset — как выбрать желаемую колонку даты в фильтре?

В этой статье хотелось бы начать раскрытие больной для многих пользователей Apache Superset темы: фильтры по дате. Начнем с малого: как суперсет выбирает колонку даты; как выбрать желаемую колонку вместо той, которую он выбирает; каким образом это реализовано; какие баги породили этим решением; почему КОП не доведет до добра. Сразу скажу - объяснений, что такое суперсет, дашборд, чарт и т.д. не будет. Имеется: установленная версия 3.1.1. Да, я знаю, что уже есть аж 6. Но версии 3-4 на рынке встречается гораздо чаще, чем 6, и на это есть множество причин, на объяснение которых можно выделить еще несколько статей. Начиная, например, с того, почему новые версии штампуются с неадекватной частотой, и заканчивая тем, почему жадность рано или поздно (скорее рано) погубит мир. Задача: сделать дашборд, добавить на него простейший чарт "таблица", построенный на датасете, в котором несколько колонок временнОго типа. Затем на готовом дашборде добавить фильтр по дате и научится выбирать желаемую ко

В этой статье хотелось бы начать раскрытие больной для многих пользователей Apache Superset темы: фильтры по дате. Начнем с малого: как суперсет выбирает колонку даты; как выбрать желаемую колонку вместо той, которую он выбирает; каким образом это реализовано; какие баги породили этим решением; почему КОП не доведет до добра.

Сразу скажу - объяснений, что такое суперсет, дашборд, чарт и т.д. не будет.

Имеется: установленная версия 3.1.1. Да, я знаю, что уже есть аж 6. Но версии 3-4 на рынке встречается гораздо чаще, чем 6, и на это есть множество причин, на объяснение которых можно выделить еще несколько статей. Начиная, например, с того, почему новые версии штампуются с неадекватной частотой, и заканчивая тем, почему жадность рано или поздно (скорее рано) погубит мир.

Задача: сделать дашборд, добавить на него простейший чарт "таблица", построенный на датасете, в котором несколько колонок временнОго типа. Затем на готовом дашборде добавить фильтр по дате и научится выбирать желаемую колонку даты для фильтра, так как при создании фильтра возможности выбрать желаемую колонку даты НЕТ. Да, это даже звучит как бред, но фильтры по дате в суперсете во истину не для слабонервных.

Для простоты возьмем дефолтный при установке датасет messages, построим визуализацию типа "таблица", в которую включим все колонки с датой, которые в этом датасете есть.

-2

Выделенное красным - колонки с датой. Суперсет автоматически ставит колонки с временнЫм типом в верх списка, вне зависимости от того, какая СУБД под капотом. Помимо выделенных колонок также добавим парочку других, таблица с одними лишь колонками даты режет глаз. И так, вот финальный вид чарта:

-3

Далее закидываем его на дашборд и добавляем фильтр по дате:

-4

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

-5

Выберем last day. Нам не сильно важно, какое именно условие мы выберем. Важно, какую колонку выберет суперсет и почему. Применяем фильтр и смотрим на запрос, полетевший в БД:

-6

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

-7

Вот и ответ на вопрос — при создании датасета суперсет автоматически выбрал bot_profile__updated как дефолтную колонку даты (только лишь потому, что она первая лексикографически, все настолько тривиально). Конечно, первый и самый простой вариант — просто выбрать нужную колонку с датой в качестве дефолтной. Но, это рабочий способ только в том случае, если на этом датасете построен только один чарт (напоминаю, ну или ввожу в курс - на одном датасете можно построить сколько угодно чартов, и каждый чарт можно добавить на сколько угодно дашбордов, ограничений нет). А что делать, если на этом датасете много чартов? Тогда, если мы изменим дефолтную колонку даты, то все другие дашборды, имеющие этот чарт, будут работать неправильно, ведь начнут фильтроваться по другой колонке даты! И более того, это не вызовет никакой ошибки. Мы просто незаметно для всех сломаем бизнес-логику других дашбордов. Так делать ни в коем (почти) случае нельзя. И более того - желтая плашка на скрине именно об это и предупреждает.

Конечно же, по-хорошему, нужно переделывать фильтр, давая пользователю самому выбирать желаемую колонку даты для фильтрации. Но, к сожалению, чаще всего разработчикам в этот момент на помощь приходит КОП (костыльно-ориентированное программирование), ну либо же дефолтный способ исправить проблему: добавь еще один уровень абстракции. Так и было сделано:

-8

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

-9

Выбираем, например, ts.

-10

Значение ts, выбранное в фильтре типа Time column, прокидывается во все фильтры с датой на дашборде.

Суммарно невозможность привязать фильтр по дате к конкретной колонке конкретного датасета и КОП с Time column открывают целый спектр багов, таких как: невозможность добавить два фильтра по дате на один датасет; невозможность добавить два фильтра по дате по разным колонкам на один дашборд; невозможность понять, а не сломал ли кто-нибудь какой-нибудь дашборд, выбрав другую колонку даты по умолчанию и т.д.

И да, в 6 версии все то же самое (она не врет, проверено):

-11

P.S. Для тех, кто считает, что раз суперсет - опенсорсный проект, то такие ошибки в нем допустимы, и вообще "не нравится - иди и сделай нормально, покажи как надо". Оставлю интересную ссылку, где коммитерам предлагали реализовать фичу за 2000$.

Feature request: stacked grouped mixed chart · Issue #32496 · apache/superset

Конечно же, большинство коммитеров монетизируют свой вклад в проект тем или иным способ.

Мораль сей басни такова: КОП до добра не доведет. Ну а мы стали понимать суперсет немного лучше.