Перейти к основному содержимому

Язык запросов Yupana (YupanaQL)

Для выполнения запросов Yupana поддерживает собственный диалект SQL. Поддерживаются следующие операции:

  • SELECT -- выборка данных.
  • UPSERT -- вставка данных.
  • KILL QUERY -- остановка запроса.
  • DELETE QUERY -- удаление запроса из истории.
  • SHOW TABLES -- вывод списка таблиц.
  • SHOW COLUMNS FROM <table_name> -- вывод списка полей таблицы.
  • SHOW QUERIES -- просмотр истории запросов.
  • SHOW UPDATES_INTERVALS - вывод списка изменений временных рядов, произошедших в указанный период.

Правила наименования полей

  1. Время для любой схемы указывается как поле 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.

  2. Поля таблицы указываются:

  • как есть (quantity или "quantity")
  • с указанием таблицы ("kkm_items"."quantity" или kkm_items.quantity)
  1. Поля внешних связей указываются в виде имясвязи_имяполя (например ItemsInvertedIndex_phrase).

  2. Фильтровать можно по размерностям, метрикам и полям внешних связей, времени, а также выражениям над ними, используя =, !=, IN ,IS NULL, IS NOT NULL для строк и =, !=, >, >=, <, <=, IN ,IS NULL, IS NOT NULL для остальных типов.

Литералы

Поддерживаются литералы следующих типов:

  1. Строки: 'Hello!'
  2. Числа (целые либо с плавающей запятой): 42 или 1234.567
  3. Даты:
  • 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' }
  1. Интервалы:
  • 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. Массивы: {1, 2, 3,}, { 'one', 'two', 'three' }.

И т.д. Важно понимать, что интервалы содержащие месяца и/или годы не могут быть использованы при сравнении длительности интервала между двумя датами. Это обуславливается тем что длина месяца или года зависит от определенной даты.

При выполнении математических операций (плюс или минус) над интервалами можно использовать любые интервалы.

Типы функций

  • Агрегация -- функция вычисляющая общее значение из множества значений (например сумму или максимум). Агрегации не могут использоваться вместе с оконными функциями.
  • Оконная -- функция вычисляющая общее значение из множества значении и их порядка. Оконные функции не могут использоваться вместе с агрегациями. Не поддерживаются в реализации Yupana для Spark.
  • Унарная -- функция над одним значением (например length или tokens).
  • Инфиксная -- функция над двумя значениями, в SQL записывается между аргументами (например + или -).
  • Бинарная -- функция с двумя значениями, например contains_all.

Функции

ФункцияТип функцииТипы аргументовТип значенияОписание
minагрегациячисло, строка, времятот жеМинимальное значение. Для строковых значение в лексикографическом порядке
maxагрегациячисло, строка, времятот жеМаксимальное значение. Для строковых значение в лексикографическом порядке
sumагрегациячислотот жеСумма
avgагрегациячислоBigDecimalСреднее значение
countагрегациялюбойLongКоличество
distinct_countагрегациялюбойLongКоличество уникальных значений
hll_countагрегациячисло, строка, времяLongАпроксимированное количество уникальных значений
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 (в любом порядке)
Функция avg:

Функция avg представляет собой функцию агрегации, позволяющую вычислять среднее значение для поля (metric, dimension) и возвращающяя значение типа BigDecimal.

Синтаксис:

avg(column_name)

Ограничения и особенности:

  • Опеделена для следующих типов данных: Double, BigDecimal, Long, Int, BigInt, Short
  • Игнорирует строки, в которых поле принимает значение NULL.
  • Возвращает null в случае, если все значения поля в выборке имеют значение null.

Пример:

SELECT avg(column_name), id
FROM some_table
WHERE time >= TIMESTAMP '2019-06-01' AND time < TIMESTAMP '2019-07-01'
GROUP BY id
Функция count:

Функция count представляет собой функцию агрегации, позволяющую получать колличество строк в выборке для поля (metric, dimension) и возвращающяя значение типа Long.

Синтаксис:

count(column_name)

Ограничения и особенности:

  • Опеделена для всех типов данных
  • Игнорирует строки, в которых поле принимает значение NULL
  • Возвращает 0 в случае, если все значения поля в выборке имеют значение null.

Пример:

SELECT count(column_name), id
FROM some_table
WHERE time >= TIMESTAMP '2019-06-01' AND time < TIMESTAMP '2019-07-01'
GROUP BY id
Функция distinct_count:

Функция distinct_count представляет собой функцию агрегации, позволяющую получать колличество строк с уникальным значением в выборке для поля (metric, dimension) и возвращающяя значение типа Long.

Синтаксис:

distinct_count(column_name)

Ограничения и особенности:

  • Опеделена для всех типов данных
  • Игнорирует строки, в которых поле принимает значение NULL
  • Возвращает 0 в случае, если все значения поля в выборке имеют значение null.

Пример:

SELECT distinct_count(column_name), id
FROM some_table
WHERE time >= TIMESTAMP '2019-06-01' AND time < TIMESTAMP '2019-07-01'
GROUP BY id
Функция hll_count:

Функция hll_count представляет собой функцию агрегации, позволяющую получать апроксимированное колличество строк с уникальным значением в выборке для поля (metric, dimension) и возвращающяя значение типа Long.

Синтаксис:

hll_count(column_name, std_err)
  • column_name - имя поля табницы
  • std_err - стандартная ошибка. Представляет собой допустмое отклонение от истинного числа уникальных элементов (например, 0.18 - это допустимая ошибка в 18%). Реализация позволяет использовать ошибку в диапазоне от 0.00003 до 0.367.

Ограничения и особенности:

  • Определена для целочисленных типов данных, строк и даты/времени
  • Игнорирует строки, в которых поле принимает значение NULL
  • Возвращает 0 в случае, если все значения поля в выборке имеют значение null.

Пример:

SELECT hll_count(column_name, 0.18), id
FROM some_table
WHERE time >= TIMESTAMP '2019-06-01' AND time < TIMESTAMP '2019-07-01'
GROUP BY id

Кроме того, поддерживаются следующие 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