YouTube трансляция: https://www.youtube.com/c/ClickHouseDB
Telegram chat: https://telegram.me/clickhouse_ru, clickhouse_en
Футболки за вопросы!
Если вы задали вопрос через Zoom
— напишите после мероприятия мне в Telegram в личку:
свой вопрос, размер футболки и адрес для доставки курьером.
... с помощью TTL выражений.
Вы уже знакомы с TTL выражениями?
CREATE TABLE (d Date,
ip IPv4 TTL d + INTERVAL 1 MONTH, ...)
ENGINE = MergeTree ...
CREATE TABLE t (d Date, ...) ENGINE = MergeTree ...
TTL d + INTERVAL 1 MONTH
TTL d + INTERVAL 1 MONTH DELETE
TTL d + INTERVAL 1 MONTH TO DISK disk_name
TTL d + INTERVAL 1 MONTH TO VOLUME volume_name
... с помощью TTL выражений.
Прореживание:
TTL d + INTERVAL 1 MONTH
DELETE WHERE is_yandex = 0
Агрегация:
CREATE TABLE t (d Date, a UInt64, b String, c String...
ENGINE = MergeTree ORDER BY (a, b, c)
TTL d + INTERVAL 1 MONTH
GROUP BY a, b SET x = sum(x), y = quantile(0.9)(y)
a, b - префикс ключа сортировки
Агрегация:
CREATE TABLE t (d Date, a UInt64, b String, c String...
ENGINE = MergeTree ORDER BY (a, b, c)
TTL d + INTERVAL 1 MONTH
GROUP BY a, b SET x = sum(x), y = quantile(0.9)(y)
— GROUP BY по префиксу ключа сортировки;
— агрегатные функции можно вычислять
от любой комбинации столбцов: SET x = argMax(x, time);
— если выражение SET для столбца
не задано — эквивалентно SET x = any(x);
— пока нельзя: комбинировать WHERE и GROUP BY.
... с помощью TTL выражений.
Хорошо подходит для временных рядов
— загрубление старых данных.
Похоже на GraphiteMergeTree,
но применимо для всех MergeTree таблиц.
Похоже на AggregatingMergeTree и SummingMergeTree,
но с порогами на время до агрегации.
Доступно в версии 20.5. Разработчик — Николай Сорокин.
Вспоминаем про pointInPolygon...
demo
Задача reverse geocoding:
— поиск полигона по координатам;
— найти самый маленький полигон,
вернуть его свойства;
— среди множеств (миллионов) полигонов;
— с разумной скоростью
и потреблением памяти;
CREATE DICTIONARY polygon_dict
(
key Array(Array(Array(Array(Float64)))),
name String,
value UInt64
)
PRIMARY KEY key
SOURCE(...)
LAYOUT(POLYGON_INDEX_CELL())
key - мульти-полигон:
Array(Float64) - пара координат, также можно Tuple(Float64, Float64);
Array(Array(Float64)) - кольцо (ring);
Array(Array(Array(Float64))) - полигон с дырками;
Array(Array(Array(Array(Float64)))) - мульти-полигон.
SELECT dictGet('polygon_dict', 'name', (x, y))
Производительность:
Границы районов России (20 000 штук, 12 млн. точек)
из OpenStreetMap.
— 2 GB оперативки;
— загрузка - 2.5 минуты;
— скорость 900 000 lookups/sec * количество ядер CPU.
Неконстантные полигоны в pointInPolygon:
Доступно в версии 20.5. Разработчики — Алексей Илюхов, Алексей Коряков.
Словари полигонов:
Ожидается в версии 20.6. Разработчики — Андрей Чулков, Антон Кваша, Артур Петуховский.
— Native
— HTTP
— ODBC
— JDBC
— MySQL
— ???
— Native
— HTTP
— ODBC
— JDBC
— MySQL
— PostgreSQL!
Проверена работа с psql и JDBC драйвером Postgres.
Работает и на чтение и на запись.
Не поддерживается:
extended query (параметризованные запросы) и COPY.
demo
Ожидается в версии 20.6. Разработчик — Мовсес Элбакян.
— Native
— HTTP
— ODBC
— JDBC
— MySQL — 19.8
— PostgreSQL — 20.6
— GRPC — прототип, разрабатывается
Apache Arrow
ORC на чтение и на запись
MsgPack, Regexp, Markdown, JSONAsString...
Какой формат реализовать завтра?
Apache Arrow:
Доступно в версии 20.5. Разработчики — Жанна Зосимова, hczhcz.
MsgPack, Regexp, Markdown:
Доступно в версии 20.4. Разработчик — Павел Круглов.
JSONAsString, ORC output:
Доступно в версии 20.5. Разработчик — Павел Круглов.
Источник MongoDB
Источник Redis
Источник Cassandra — 20.5
Layout "direct" и "complex_key_direct" — 20.5
Настройки форматов для словарей — 20.4
CREATE DICTIONARY ...
SETTINGS format_csv_delimiter = '|'
+ настройки форматов для Kafka таблиц — 20.5
Пример проблемы:
Большой постоянно обновляемый
справочник баннеров в MySQL (~10 млрд. строк).
Если использовать cache-словари, то размера кэша не хватает
и идёт слишком много запросов в MySQL.
Решение:
Гибридная структура данных — оперативка + SSD.
В оперативке 16 байт на ключ + буфер свежих данных.
Все данные всё-равно не помещаются в кэш...
но теперь hit rate примерно 100% и всё быстро.
Ожидается в версии 20.6. Разработчик — Никита Васильев.
Запись в ODBC и JDBC таблицы
SELECT * FROM odbc('DSN', table);
INSERT INTO TABLE FUNCTION odbc('DSN', table);
Доступно в версии 20.5. Разработчик — Артемий Бобровский.
Табличная функция mongo
Стриминг из RabbitMQ
Репликация из MySQL
GROUP BY и DISTINCT по сортированным данным
demo
Доступно в версии 20.5. Разработчик — Дмитрий Рубашкин.
Распараллеливание FINAL.
Оптимизации сортировок.
Использование оперативки при двухуровневой агрегации.
Параллельный и распределённый INSERT SELECT.
NULL в CREATE TABLE. Синонимы типов (20.5):
SET data_type_default_nullable = 1;
CREATE TEMPORARY TABLE test (
x INT NULL, y VARCHAR(255) NOT NULL, z BLOB);
Сравнение любых типов со строковыми константами (20.5):
SELECT ... FROM table WHERE x = '1'
Сохранение Nullable при CAST (20.6):
SELECT toTypeName(x), toTypeName(CAST(x AS FLOAT));
Nullable(UInt8) Nullable(Float32)
Агрегатные функции count / count distinct / uniq от NULL. (20.5)
SELECT COUNT(DISTINCT x) FROM (SELECT NULL AS x)
0
Сравнение String и FixedString с padding: (20.4)
SELECT 'x' = CAST('x' AS FixedString(10))
Операторы DATE и TIMESTAMP (20.4):
SELECT DATE '2020-06-18'
Отказ от leader election при репликации.
Distributed over Distributed.
Метрики perf events.
Куски данных в оперативке и WAL.
Opt-in отправка ошибок в Sentry.
Агрегатные функции для статистических тестов.
Типы Decimal256, Decimal512, Float16.
Поиск полудубликатов текстов.
Поддержка OpenTracing.
https://clickhouse.tech/docs/ru/whats-new/extended-roadmap/
~ 500 задач с подробным описанием — зависимости, исполнители...