Язык запросов Yupana (YupanaQL)
Для выполнения запросов Yupana поддерживает собственный диалект SQL. Поддерживаются следующие операции:
SELECT
-- выборка данных.UPSERT
-- вставка данных.KILL QUERY
-- остановка запроса.DELETE QUERY
-- удаление запроса из истории.SHOW TABLES
-- вывод списка таблиц.SHOW COLUMNS FROM <table_name>
-- вывод списка полей таблицы.SHOW QUERIES
-- просмотр истории запросов.SHOW UPDATES_INTERVALS
- вывод списка изменений временных рядов, произошедших в указанный период.
Правила наименования полей
Время для любой схемы указывается как поле
time
типа TIMESTAMP. Доступны следующие функции для работы со временем:trunc_second
,trunc_minute
,trunc_hour
,trunc_day
,trunc_month
,trunc_year
.extract_second
,extract_minute
,extract_hour
,extract_day
,extract_month
,extract_year
.Поля таблицы указываются:
- как есть (quantity или "quantity")
- с указанием таблицы ("kkm_items"."quantity" или kkm_items.quantity)
Тэги указываются как есть (например kkmId)
Поля внешних связей указываются в виде
имясвязи_имяполя
(например ItemsInvertedIndex_phrase).Фильтровать можно по размерностям, метрикам и полям внешних связей, времени используя =,!=,IN,IS NULL/NOT NULL для строк и =,!=,>,>=,<,<=,IN,IS NULL/NOT NULL для остальных типов.
Литералы
Поддерживаются литералы следующих типов:
- Строки:
'Hello!'
- Числа (целые либо с плавающей запятой):
42
или1234.567
- Даты:
TIMESTAMP '2018-08-06'
TIMESTAMP '2018-08-06 16:24:50'
TIMESTAMP '2018-08-06 16:24:50.123'
{ ts '2017-06-13' }
{ ts '2017-06-13 09:15:44' }
{ ts '2017-06-13 09:15:44.666' }
- Интервалы:
INTERVAL '06:00:00'
-- 6 часовINTERVAL '1 12:00:00'
-- 1 день и 12 часовINTERVAL '1' HOUR
-- 1 часINTERVAL '30' MINUTE
-- 30 минутINTERVAL '2 12' DAY TO HOUR
-- 2 дня 12 часовINTERVAL '6 12:30' DAY TO MINUTE
-- 6 дней 12 часов 30 минутINTERVAL '3' MONTH
-- 3 месяцаINTERVAL '1' YEAR
-- 1 годINTERVAL '3-10' MONTH TO DAY
-- 3 месяца и 10 дней
- Массивы:
{1, 2, 3,}
,{ 'one', 'two', 'three' }
.
И т.д. Важно понимать, что интервалы содержащие месяца и/или годы не могут быть использованы при сравнении длительности интервала между двумя датами. Это обуславливается тем что длина месяца или года зависит от определенной даты.
При выполнении математических операций (плюс или минус) над интервалами можно использовать любые интервалы.
Функции
Функция | Тип функции | Типы аргументов | Тип значения | Описание |
---|---|---|---|---|
min | агрегация | число, строка, время | тот же | Минимальное значение. Для строковых значение в лексикографическом порядке |
max | агрегация | число, строка, время | тот же | Максимальное значение. Для строковых значение в лексикографическом порядке |
sum | агрегация | число | тот же | Сумма |
count | агрегация | любой | число | Количество |
distinct_count | агрегация | любой | число | Количество уникальных значений |
lag | оконная | любой | тот же | Предыдущее значение в группе записей. Группа определяется в запросе в секции группировки. Сортировка по времени. |
trunc_year | унарная | время | время | Округление времени до года |
trunc_month | унарная | время | время | Округление времени до месяца |
trunc_day | унарная | время | время | Округление времени до дня |
trunc_hour | унарная | время | время | Округление времени до часа |
trunc_minute | унарная | время | время | Округление времени до минуты |
trunc_second | унарная | время | время | Округление времени до секунды |
exract_year | унарная | время | число | Извлечение значения года из времени |
exract_month | унарная | время | число | Извлечение значения месяца из времени |
exract_day | унарная | время | число | Извлечение значения дня из времени |
exract_hour | унарная | время | число | Извлечение значения часа из времени |
exract_minute | унарная | время | число | Извлечение значения минуты из времени |
exract_second | унарная | время | число | Извлечение значения секунды из времени |
abs | унарная | число | число | Значение числа по модулю |
tokens | унарная | строка | массив строк | Получение стемированых транслитерированых строк из строки |
tokens | унарная | массив строк | массив строк | Получение стемированых транслитерированых строк из массива строк |
split | унарная | строка | массив строк | Разбиение строки на слова по пробелам |
length | унарная | строки, массивы | строки, массивы | Длина строки или количество элементов в массиве |
array_to_string | унарная | массив | строка | Преобразование массивы в строку в формате "( a, b, .., n)" |
id | унарная | размерность | число | Идентификатор значения размерности в словаре |
+ | инфиксная | число, строка, интервал | тот же | Сложение |
- | инфиксная | число | тот же | Вычитание |
* | инфиксная | число | тот же | Умножение |
/ | инфиксная | число | тот же | Деление |
+ | инфиксная | время и интервал | время | Сложение |
- | инфиксная | время и интервал | время | Вычитание |
- | инфиксная | время и время | интервал | Вычитание |
= | инфиксная | число, строка, время | логический | Сравнение на равенство |
<> или != | инфиксная | число, строка, время | логический | Сравнение на неравенство |
> | инфиксная | число, строка, время | логический | Сравнение на больше |
< | инфиксная | число, строка, время | логический | Сравнение на меньше |
> = | инфиксная | число, строка, время | логический | Сравнение на больше или равно |
<= | инфиксная | число, строка, время | логический | Сравнение на меньше или равно |
contains | бинарная | массив и тип элемента | логический | True если массив содержит элемент, иначе False |
contains_all | бинарная | массив и массив | логический | True если массив1 содержит все элементы массива2, иначе False |
contains_any | бинарная | массив и массив | логический | True если массив1 содержит хотя бы один элемент из массива2, иначе False |
contains_same | бинарная | массив и массив | логический | True если массив1 содержит те же элементы что и массив2 (в любом порядке) |
Типы функций
- Агрегация -- функция вычисляющая общее значение из множества значений (например сумму или максимум). Агрегации не могут использоваться вместе с оконными функциями.
- Оконная -- функция вычисляющая общее значение из множества значении и их порядка. Оконные функции не могут использоваться вместе с агрегациями. Не поддерживаются в реализации Yupana для Spark.
- Унарная -- функция над одним значением (например length или tokens).
- Инфиксная -- функция над двумя значениями, в SQL записывается между аргументами (например + или -).
- Бинарная -- функция с двумя значениями, например contains_all.
Кроме того, поддерживаются следующие SQL выражения:
Выражение | Описание |
---|---|
x IN (1, 2 .. z) | Проверка что x является одним из элементов заданного множества констант |
x NOT IN (3, 4, .. z) | Проверка что x не является одним из элементов заданного множества констант |
x IN NULL | Проверка что значение x не определено |
x IS NOT NULL | Проверка что значение x определено |
x BETWEEN 1 AND 10 | То же самое что x >= 1 AND x <= 10 |