ClickHouse UDF
ClickHouse UDF предоставляет доступ из YQL к встроенным функциям ClickHouse и SELECT запросам на его SQL диалекте.
Также можно использовать функции из CHYT.
Внимание
При использовании в регулярных и production процессах рекомендуется добавить тесты на запросы.
Ключевые особенности текущей реализации, которые стоит иметь в виду:
- Встроенные функции запускаются над каждым значением отдельно, а не блоками, как это происходит в самом ClickHouse. Таким образом по производительности оно как правило медленнее и одноименных функций в ClickHouse и аналогичных функций в YQL. Зато данный механизм позволяет использовать функции, которые доступны в ClickHouse, но по каким-либо причинам не имеют аналогов в YQL.
- Используется свежий master ClickHouse на GitHub, но часть функциональности отключена из-за расхождений/отсутствия сторонних библиотек в contrib Аркадии. При синхронизации ClickHouse GitHub и Аркадии сейчас отсутствуют механизмы жесткого контроля за обратной совместимостью.
- В будущем возможно появится более тесная интеграция YQL и ClickHouse, которая будет выглядеть более дружелюбно для пользователей и не будет обладать столь серьезными недостатками.
Вызов встроенных функций
Встроенные функции ClickHouse доступны для вызова из YQL через префикс ClickHouse::. Например, чтобы вызвать ClickHouse функцию length, нужно написать ClickHouse::length("my_string").
Полный список встроенных функций ClickHouse на данный момент доступен только в его документации. Как упоминалось выше, многие из них сейчас не доступны из Аркадии, но активно ведётся работа по сокращению расхождения.
ClickHouse::run
Позволяет обрабатывать таблицы SELECT запросом в диалекте ClickHouse через PROCESS или REDUCE. В этом режиме обработка идёт потоково и при обработке больших таблиц стоит ожидать производительность на более приемлемом уровне по сравнению с вызовом ClickHouse функции по отдельности. В REDUCE рекомендуется использовать TableRows(), чтобы потоковая обработка запускалась на весь джоб один раз, а не на каждый ключ отдельно, из-за чего при небольшом числе записей на ключ константные расходы на инициализацию могут быть заметны на общем фоне. Также есть накладные расходы на копирование данных на границах между YQL и ClickHouse движками и чем «тяжелее» ClickHouse запрос, тем менее это будет заметно на его фоне.
-- Преагрегация данных через PROCESS
PROCESS my_table
USING ClickHouse::run(
TableRows(),
"select key as key, count(*) as cnt from Input group by key" -- ClickHouse SQL
);
-- Финальная агрегация данных по заданному ключу через REDUCE
$callable = ($input) -> {
return ClickHouse::run(
$input,
"select key as key, sum(cnt) as cnt from Input group by key" -- ClickHouse SQL
)
};
REDUCE my_table
ON key
USING ALL $callable(TableRows());
Для обращения к входным данным внутри ClickHouse запроса необходимо обращаться к таблице с константным именем Input.
ClickHouse::source
Позволяет выполнить запрос в диалекте ClickHouse без входных данных.
SELECT * FROM AS_TABLE(()->(ClickHouse::source(
"select * from system.numbers limit 5" -- ClickHouse SQL
)));
Соответствие типов данных
| Тип данных ClickHouse | Тип данных YQL | Комментарий |
|---|---|---|
| IntN | IntN | |
| UIntN | UintN | |
| Float32 | Float | |
| Float64 | Double | |
| String | String | Индексация элементов в ClickHouse начинается с 1 |
| FixedString(N) | String | Индексация элементов в ClickHouse начинается с 1, поддерживается только как выходной тип |
| Date | Date | |
| DateTime | DateTime | |
| UUID | Uuid | |
| Nullable | Optional | |
| Array | List | Индексация элементов в ClickHouse начинается с 1 |
| Tuple | Tuple | Индексация элементов в ClickHouse начинается с 1 |
| AggregateFunction(...) | Tagged<String,'AggregateFunction(...)'> | |
| Enum(S1=V1,S2=V2,...) | Enum<S1,S2,...> |
Остальные типы данных не поддерживаются.