ODAG в Qlik Sense: генерация приложений «по требованию»
Генерация приложений «по требованию», или On-demand App Generation (ODAG), — один из методов работы в Qlik с большими данными (наряду с Direct Discovery, Chaining, Big Data Index). Доклад Сергея Полехина по ODAG на qRUG Camp 2018 вошел в тройку самых полезных для последующего применения, поэтому сегодня поговорим именно на эту тему. В посте расскажу, как подготовить Qlik-приложения для ODAG, дам пример скрипта с комментариями, который вы можете подработать под свои задачи, а также презентацию по ODAG от Сергея Полехина, архитектора решений Qlik.
КОГДА ИСПОЛЬЗОВАТЬ ODAG?
При работе с большими данными всегда стоит дилемма: потенциально нужно иметь возможность работы сразу со всем массивом данных, однако с технической точки зрения это не всегда оказывается возможным из-за банальных ограничений возможностей оборудования. Когда, например, загружаемые в аналитическое приложение данные не помещаются в оперативную память и/или сложность расчетов в приложении «убивает» всю интерактивность.
Очевидный вариант решения дилеммы – попытаться сохранить пользователю возможность работать со всеми данными, но не как с единым неподъемным грузом, а разбив данные на части. При этом в идеале пользователь сам должен иметь возможность выбирать – с какой частью данных ему необходимо работать в данный момент исходя из решаемой задачи, но при этом так, чтобы эта часть данных технически быстро и интерактивно могла обрабатываться сервером.
Это похоже на поход в магазин – пользователь сам наполняет приложение-шаблон необходимым блоками данных: определенным периодом времени, сегментом покупателей, ассортиментом, географией и т.д, а затем этот набор данных загружается в оперативную память, и пользователь ведет привычную аналитику в Qlik Sense.
В наших условиях ограниченных серверных мощностей этот подход может быть полезен не только для Big Data, но и для экономии серверных ресурсов =)
Из важных плюсов этого подхода при работе с Big Data в Qlik Sense:
- Доступ к не-SQL-ным источникам данных (например, Teradata Aster, MapR, SAP BEx и др.). В устаревшем механизме Direct Discovery возможна работа только с источниками, поддерживающими обмен данными по протоколу ODBC.
- Загрузка всех необходимых пользователю данных в оперативную память, что даёт возможность использования уникальных принципов работы со множествами данных (в Direct Discovery, например, все данные находятся не в памяти, а в источнике данных до момента непосредственного доступа к ним и поэтому к ним неприменимы ни, например, поиск, ни операции над множествами данных).
- Создание и объем приложений прозрачно контролируется с точки зрения ИТ – есть специальная серверная служба On-demand apps service, которая позволяет, например, настроить объем и количество приложений, а также определить количество приложений генерируемых одновременно и т.д.
КАК РАБОТАЕТ ODAG?
Схема работы ODAG представлена на схеме ниже, дальше объясню ее по пунктам:
Шаг 1. Для начала работы с ODAG вам нужно создать 2 приложения:
- Приложение для отборов (Selection App): это приложение наполняется данными измерений и объектами визуализации, обеспечивающими работу с данными на высоком уровне агрегирования. В этом приложении пользователи выбирают данные для последующего углубленного анализа. И сразу совет по пользовательскому интерфейсу – в приложении нужно предусмотреть поля (счетчики записей), позволяющие оценивать объем данных, загружаемый в приложение (благодаря этому вы сможете установить лимит на количество строк данных загружаемых в приложение)
- Шаблон приложения для анализа данных (App Template): в нём размещается предварительно подготовленный сценарий загрузки (скрипт), в который автоматически попадут отборы данных пользователя, сделанные им в приложении Selections App. Ну а к дизайну приложения никаких комментариев тут нет – делайте все, как обычно, чтобы пользователям было удобно работать с аналитикой
Шаг 2. Пользователь выбирает требуемый срез данных в приложении при помощи интуитивно понятных действий в привычных объектах визуализации
Шаг 3. Пользователь инициирует создание приложения для анализа данных (Analysis App), нажимая интуитивно понятную кнопку, предусмотренную в интерфейсе пользователя
Шаг 4. Приложение для анализа данных автоматически создаётся на основе шаблона (App Template) и наполняется нужными данными
Шаг 5. Приложение для анализа данных публикуется – в поток (stream) пользователя или в другой выбранный поток, на который у пользователя имеются соответствующие полномочия.
Шаг 6. Если пользователю требуется любой другой срез данных, то он просто повторяет шаги 2-5
ОСОБЕННОСТИ ПОСТРОЕНИЯ SELECTION APP
Скрипт приложения для отбора данных (Selection App) должен загружать достаточно данных, чтобы пользователи могли делать выборки в требуемых им полях и при этом понимать, сколько данных они получат в сгенерированном (детальном) приложении.
Таким образом, с точки зрения интерфейса вам нужны лишь объекты, позволяющие «отфильтровать» требуемые данные и индикатор, который показывает, сколько еще строк данных пользователь может выбрать, чтобы сгенерировать приложение по ODAG (и не выйти при этом за ограничения по объему данных). Мне очень понравился вариант с gauge чартом, который предложил Майкл Лаверик (Michael Laverick):
При этом ограничения на объем данных в сгенерированном по ODAG приложении можно выставлять очень гибко. Так, можно наложить условие на количество выборок, например, разрешать пользователям выбирать до 5 продуктовых категорий.
Qlik Help по созданию приложения для отбора данных для ODAG
ОСОБЕННОСТИ ПОСТРОЕНИЯ TEMPLATE APP
Здесь у нас будет пример скрипта с комментариями от Майкла Лаверика, но сначала мини-инструкция:
1. Стоит начать с обычного скрипта загрузки. В него мы уже будем добавлять ODAG скрипт, чтобы генерировать раздел с WHERE на лету и вызывать его через переменную. При этом, когда вы добавите переменную с WHERE в скрипт, Qlik может выдать ошибку. Просто знайте, что все ок и идите дальше.
2. Добавьте новую страницу со скриптом и поместите ее сразу за главной страницей со скриптом, а затем добавьте на нее такой скрипт:
//Subroutine for fields to filter on //Creates a WHERE statement which can be used in table loads to restrict the data to a smaller set //This WHERE statement is for loading from a QVD. To load from SQL db change to 'WHERE IN()' SUB ExtendWhere(Name, ValVarName) //Name will be the filtered field name and ValVarName the values LET T = Name & '_COLNAME'; LET ColName = $(T); LET Values = $(ValVarName); IF len(Values) > 0 THEN IF len(WHERE_PART) > 0 THEN //If WHERE clause exists then extend it with further values LET WHERE_PART = '$(WHERE_PART) AND MATCH($(ColName),$(Values))'; ELSE LET WHERE_PART = ' WHERE MATCH($(ColName),$(Values))'; //If WHERE clause does not exist then create it ENDIF ENDIF END SUB; //Here we set the variables ready to hold the names of any fields we want considering for ODAG filtering (selection) //The ods_ field names bind the fields to those in your Selections Application. //The two Sel_ variables below are examples. Replace Customer and Sub_Group with your own fields. SET Sel_Customer = ; //resets the variable from any previous reload SET Sel_Customer = $(ods_Customer_Name); // follow 'ods_' with the field name as it appears in your UI / final load SET Sel_Customer_COLNAME ='CUST_NAME'; // enter the field name as it appears in the source data (e.g. QVD/SQL db) SET Sel_Sub_Group = ; SET Sel_Sub_Group = $(ods_Sub_Group_Name); SET Sel_Sub_Group_COLNAME ='SUBGROUP_NAME'; SET WHERE_PART = ''; //you may opt to add your own WHERE clause that is used in every ODAG //e.g. you always want 2018 data... 'WHERE Year = 2018' //if so the sub routine will extend it with further selections //This section builds the WHERE_PART variables that are passed to the SUB //It extracts the values that have been selected from each field FOR EACH fldname IN 'Sel_Customer', 'Sel_Sub_Group' //insert your Sel_ variables LET vallist = $(fldname); WHEN (IsNull(vallist)) LET vallist = ''; //If Qlik suggests an error here ignore it IF len(vallist) > 0 THEN CALL ExtendWhere('$(fldname)','$(vallist)'); ENDIF NEXT fldname //Evaluate the WHERE_PART variable in the script for debugging TRACE Generated WHERE clause: ; TRACE $(WHERE_PART);
СВЯЗЫВАЕМ 2 ПРИЛОЖЕНИЯ ДЛЯ ODAG
Откройте приложение для отборов (Selection App) и в режиме правок нажмите в левом меню на раздел «App navigation links». Не забудьте, что для того, чтобы увидеть этот раздел, вы должны работать с сервером Qlik Sense, т.к. в редакции Qlik Sense Desktop функционал ODAG не реализован.
А теперь настраиваем меню по пунктам:
1. Создайте новую навигационную связь для ODAG и придумайте ей название
2. Выберите шаблон приложения для анализа данных (App Template), который будет связан с вашим приложением выборок
3. Добавьте выражение, которое считает строки. Например: SUM(TOTAL_LINES)
4. Укажите максимальное количество строк, которое можно будет передать в приложение-шаблон (template app). Оно может быть меньше или равно SUM(TOTAL_LINES)
5. Укажите, сколько приложений «по запросу» может генерироваться одновременно
6. Укажите время хранения созданных ODAG приложений – оно исчисляется в часах, днях или такие приложения можно вообще никогда не удалять
7. Укажите страницу, на которую будет перенаправляться пользователь по умолчанию в сгенерированных приложениях
8. Укажите поток (stream), в который будут публиковаться сгенерированные приложения (если вы вообще хотите их публиковать в потоки)
9. Перетащите созданную навигационную ссылку в «подвал» приложения.
10. Дальше попробуем все протестировать и сгенерировать свое первое приложение «по требованию»:
- Выбираете в фильтрах нужные данные и если выбранное вами количество записей не превышает установленного ранее вами лимита, то кнопка ODAG становится зеленой – это подсказывает, что можно сгенерировать приложение
- Кликаете на кнопку ODAG, затем на «i» — так вы сможете посмотреть, сколько строк в каком статусе загрузки у вас в приложении. Чтобы закрыть окошко с информацией, опять кликнете на «i»
11. Когда приложение будет готово, нажимайте опции, открывайте и наслаждайтесь аналитикой:
СОВЕТЫ ПО СИНТАКСИСУ ODAG ОТ СЕРГЕЯ ПОЛЕХИНА
На qRUG Camp 2018 Сергей Полехин, архитектор решений Qlik, поделился некоторыми советами по синтаксису генерации приложений «по требованию», приведу некоторые из них.
2 идеи того, почему при реализации функционала ODAG синтаксис сценариев загрузки был расширен:
Binding expressions (цвет имеет значение): Отбор в конкретном поле (зелёный цвет) не всегда совпадает со связанными значениями в других полях данных (белый цвет̆). Эти различия можно учитывать в логике вашего приложения.
- $(ods_FIELD_NAME) или $(od_FIELD_NAME) – в явном виде отобранные пользователем значения (Selected)
- $(odo_FIELD_NAME) – связанные значения (Optional)
- $(odso_FIELD_NAME) – отобранные или связанные значения (Selected, Optional)
2 идеи, о том, как учитывать особенности реализации имеющихся у вас баз данных:
-
Не все БД поддерживают автоматическое преобразование типов: требование числового представления данных
- $(od_FIELD_NAME_n) – требование использовать тип «число»
- Не все БД в качестве разделителей̆ используют одни и те же символы: можно потребовать использования конкретных разделителей̆
- $(od_FIELD_NAME){«quote»: «|», «delimiter»: «;»}
- Пример результата:|Январь|;|Февраль|;|Март|
А вот и полноценная презентация Сергея Полехина с qRUG Camp 2018 (pdf)