Skip to content

Instantly share code, notes, and snippets.

View alexey-milovidov's full-sized avatar

Alexey Milovidov alexey-milovidov

View GitHub Profile
wget https://clickhouse-datasets.s3.yandex.net/hits/tsv/hits_v1.tsv.xz
wget https://clickhouse-datasets.s3.yandex.net/visits/tsv/visits_v1.tsv.xz
xz -v -d hits_v1.tsv.xz
xz -v -d visits_v1.tsv.xz
clickhouse-client
CREATE TABLE test.hits ( WatchID UInt64, JavaEnable UInt8, Title String, GoodEvent Int16, EventTime DateTime, EventDate Date, CounterID UInt32, ClientIP UInt32, ClientIP6 FixedString(16), RegionID UInt32, UserID UInt64, CounterClass Int8, OS UInt8, UserAgent UInt8, URL String, Referer String, URLDomain String, RefererDomain String, Refresh UInt8, IsRobot UInt8, RefererCategories Array(UInt16), URLCategories Array(UInt16), URLRegions Array(UInt32), RefererRegions Array(UInt32), ResolutionWidth UInt16, ResolutionHeight UInt16, ResolutionDepth UInt8, FlashMajor UInt8, FlashMinor UInt8, FlashMinor2 String, NetMajor UInt8, NetMinor UInt8, UserAgentMajor UInt16, UserAgentMinor FixedString(2), CookieEnable UInt8, JavascriptEnable UInt8, IsMobile UInt8, MobilePhone UI
Поддержка Protobuf как формата ввода-вывода для ClickHouse.
ClickHouse поддерживает всевозможные форматы данных для получения результата запроса SELECT или для загрузки данных при INSERT. К этим форматам относятся как текстовые (CSV, TSV, JSONEachRow) так и бинарные (RowBinary, Native).
Пользователи хотят иметь в качестве доступного формата ещё и Protobuf.
Формат представляет собой записанные подряд Protobuf сообщения, по одному на каждую строку таблицы, разделённые неким общепринятым способом: https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/util/delimited_message_util.h
Пользователь может предоставить свою protobuf схему для загрузки и выгрузки данных. Это определяется настройкой format_schema (по аналогии с имеющимся форматом CapNProto). При этом, схема может более-менее свободно относиться к таблице. Так, один тип данных ClickHouse может быть по-разному представлен в protobuf схеме. Например, UInt8 в ClickHouse может быть int64 в Protobuf. String может быть представлен и как
Дополнительные индексные структуры для пропуска блоков данных в таблицах.
Secondary index structures for data skipping in ClickHouse DBMS.
Васильев Никита Сергеевич, Курс 2, БПМИ171
Методы индексации данных на основе space filling curves.
Data indexing methods with space filling curves in ClickHouse DBMS.
Чулков Андрей Сергеевич, Курс 2, БПМИ171
[
{
"hostname": "mtlog-perftest03j.yandex.ru",
"main_metric": "min_time",
"num_cores": 16,
"num_threads": 32,
"parameters": {
"func": ["sum", "uniq", "uniqExact", "uniqHLL12", "uniqCombined(12)", "uniqCombined(13)", "uniqCombined(14)", "uniqCombined(15)", "uniqCombined(16)", "uniqCombined(17)", "uniqCombined(18)", "uniqCombined(19)", "uniqCombined(20)", "uniqUpTo(3)", "uniqUpTo(5)", "uniqUpTo(10)", "uniqUpTo(25)", "uniqUpTo(100)"],
"key": ["1", "SearchEngineID", "RegionID", "SearchPhrase", "ClientIP"]
},
$ docker run --network host --name mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7
$ mysql -uroot --password=my-secret-pw --host=127.0.0.1
CREATE DATABASE test_dictionary;
CREATE TABLE test_dictionary.RefProfit
(
sourceId int(11) NOT NULL,
money decimal(5,5) unsigned NOT NULL,
dateStart date NOT NULL DEFAULT '1970-01-01',

(сделали) Подсказки в фабриках на основе edit distance.

Всевозможные объекты: функции, агрегатные функции, типы данных, движки таблиц, и т. п. достаются по имени из фабрик. Часто пользователь допускает опечатку. Например, вместо SELECT count(*) может быть написано SELECT cunt(*). В случае опечатки, необходимо в текст сообщения добавлять указание на ближайшие варианты. Для реализации можно использовать расстояние Левенштейна и полный перебор, или (лучше) - триграмный индекс. Подсказки выдаём, если указанное имя отличается от существующего на 1..2 буквы. Сортируем возможные варианты в порядке похожести. Для того, чтобы это работало во всех фабриках, может быть, потребуется обобщить их.

(сделали) Функции для geoHash.

Geohash - способ преобразования географических координат в строку, так что отображение обладает свойством локальности. https://en.wikipedia.org/wiki/Geohash В качестве библиотеки следует использовать эту: https://github.com/yinqiwen/geohash-int Необходимо добавить функции для перевода в

Дополнительные индексные структуры для пропуска блоков данных в таблицах.

Secondary index structures for data skipping in ClickHouse DBMS.

Done 🚀

  • Эту задачу взял Никита Васильев

В большинстве СУБД есть возможность создавать вторичные индексы. Вторичный индекс обычно представляет собой дерево, которое позволяет найти расположение записей по некоторому ключу. Но в аналитических СУБД вторичные индексы редко применяются в чистом виде.

Причина состоит в том, что для одного запроса требуется, как правило, прочитать большое количество записей - в этом случае мы могли бы найти эти записи по индексу, но прочитать их с диска было бы всё-равно сложно: если данные не расположены более-менее локально, то для их чтения пришлось бы делать много дисковых seek-ов и разжимать много сжатых блоков. Поэтому в ClickHouse (и в других похожих системах) есть только один индекс, по которому данные более-менее упорядочиваются (clustered index), что обеспечивает возможность эффективно читать диапазоны по этому ключу.

Оптимизация стратегии слияний.
Включить part_log. Для этого, раскомментируйте part_log в конфигурационном файле сервера.
Посмотреть на то, что происходит при вставке синтетических данных.
В clickhouse-client:
Кодирование строк со словарём и обработка запроса без декодирования строк
===Мотивация
Пользователи часто используют тип данных %%String%% для хранения повторяющихся строковых значений. Мы всегда говорим, что это - антипаттерн и рекомендуем либо вручную писать вместо строк числовые идентификаторы, либо использовать %%Enum%%, либо использовать внешние словари. Но есть причины, по которым такой сценарий использования будет продолжать использоваться, и нам необходимо к нему адаптироваться.
Пример на данных Метрики Приложений:
(вырезано цензурой)
SELECT user_id, arrayReduce('sum',[if(f21<0.287376, if(f2<-1.34168, if(f21<-0.0465033, -0.0411413, -0.0168165), if(f18<0.0541038, -0.0486026, -0.0432873)), if(f2<-1.12007, if(f19<0.514323, -0.00154215, 0.0279125), if(f23<-0.0269176, -0.0391427, -0.0148464))),if(f21<0.287376, if(f2<-1.30474, if(f21<-0.0465033, -0.0407256, -0.0184058), if(f23<-0.0274336, -0.0469912, -0.0290771)), if(f2<-1.157, if(f23<-0.027484, -0.00114219, 0.029407), if(f2<-0.344426, -0.0242555, -0.0423453))),if(f18<0.883746, if(f2<-1.34168, if(f21<-0.00940569, -0.0386349, -0.00968768), if(f23<-0.0274894, -0.0458335, -0.0281316)), if(f2<-1.30474, if(f23<-0.0273632, -0.00346079, 0.0302068), if(f19<0.514323, -0.0340366, -0.00648281))),if(f21<0.250278, if(f2<-1.34168, if(f21<-0.0465033, -0.0383863, -0.0166084), if(f18<0.0541038, -0.0453193, -0.0402171)), if(f2<-1.30474, if(f22<0.233904, 0.00176162, 0.0268355), if(f2<-0.639908, -0.0178382, -0.0385038))),if(f18<0.607199, if(f2<-1.34168, if(f21<-0.00940569, -0.0373913, -0.0101554), if(f23<-0.0274336