Подключение внешних источников
Для выполнения аналитических задач по укрупненным размерностям, например “город”, “торговая точка”, “товарная категория” реализован механизм внешних связей, где значения размерностей отображаются в значения полей внешних каталогов.
Внешняя связь — это интерфейс отображения и/или группировки размерностей который позволяет определить древовидные и иные структуры размерностей временного ряда. Например: ИНН организации отображается в набор значений идентификаторов кассовых аппаратов.
Каждая внешняя связь — это некоторый набор полей, привязанный к какой-то размерности. При этом внешняя связь может сохранять как значение этой размерности, так и идентификатор значения в словаре, где и хранится отображение идентификатора размерности в её значение.
Например:
Стандартные внешние связи
В схеме по умолчанию есть две внешние связи, реализация которых входит в пакет yupana-external-links
. Реализация
DAO для этих внешних связей поверх HBase входит в пакет yupana-hbase
.
ItemsInvertedIndex
Индекс слов встречающихся в товарах. Используется для полнотекстового поиска в наименованиях товаров
Поля:
- phrase — слова для поиска. Порядок слов не имеет значения, например “пиво жигулевское” и “жигулевское пиво”. Поскольку внутри каталога слова хранятся в стемированном виде, при поиске окончания не учитываются. Запросы “пиво жигулевское” и “пиву жигулевскому” считаются одинаковыми (и пребразуются к набору слов “piv”, “zhigulevsk”).
RelatedItemsCatalog
Каталог сопутствующих товаров. Позволяет находить совместные покупки товаров.
Поля:
- item — строгое название сопутствующего товара (чекового наименования).
- phrase — часть названия сопутствующего товара (чекового наименования), аналогично полю phrase в
ItemsInvertedIndex
.
Поля каталога могут использоваться только в условиях (а не как поля запроса). Рекомендуется использовать
со схемой kkm_items
.
Примеры:
- Ищем покупки вместе с пивом:
SELECT item, time, kkmId
FROM kkm_items
WHERE time >= TIMESTAMP '2018-11-01' AND time < TIMESTAMP '2018-12-01'
AND RelatedItemsCatalog_phrase = 'пиво'
- Ищем номера чеков, в которых присутствуют пиво и чипсы:
SELECT item, time, kkmId, documentNumber
FROM kkm_items
WHERE time >= TIMESTAMP '2018-11-01' AND time < TIMESTAMP '2018-12-01'
AND RelatedItemsCatalog_phrase = 'пиво'
AND itemsInvertedIndex_phrase = 'чипсы'
- Ищем номера чеков, где присутствуют пиво и чипсы, но нет орешков:
SELECT item, time, kkmId, documentNumber
FROM kkm_items
WHERE time >= TIMESTAMP '2018-11-01' AND time < TIMESTAMP '2018-12-01'
AND RelatedItemsCatalog_phrase = 'пиво'
AND itemsInvertedIndex_phrase = 'чипсы'
AND RelatedItemsCatalog_phrase <> 'орешки'
Схема работы внешней связи
При выполнении запроса к Yupana внешняя связь может принимать участие в двух этапах обработки запроса.
Трансформация запроса
На этом этапе условия из запроса, относящиеся к каталогу, преобразуются в условия в терминах размерностей и/или метрик. Например, заданные в условии ИНН преобразуются в наборы идентификаторов касс.
Извлечение значений
Если поля внешней связи являются частью результата запроса, то внешняя связь должна заполнить эти поля в результирующем наборе данных.
Иногда эта операция не имеет смысла, или может быть слишком неэффективной, поэтому встречаются внешние связи, поля которых можно использовать только в условиях запроса, но не в результирующих выражениях. Примером такой связи является инвертированный индекс.
Внешняя связь получает строки результирующего набора пачками, читает значение размерностей и устанавливает значения запрошенных полей внешней связи для каждой строки.