Расширенный учебник
Чего ожидать от этого учебника?
В этом учебнике вы создадите таблицу и вставите большой набор данных (два миллиона строк из данных такси Нью-Йорка). Затем вы выполните запросы к набору данных, включая пример того, как создать словарь и использовать его для выполнения JOIN.
В этом учебнике предполагается, что у вас есть доступ к запущенному сервису ClickHouse. Если нет, ознакомьтесь с Быстрым стартом.
1. Создайте новую таблицу
Данные такси Нью-Йорка содержат детали миллионов поездок на такси, с такими колонками, как время и место подачи и высадки, стоимость, сумма чаевых, дорожные сборы, тип оплаты и так далее. Давайте создадим таблицу для хранения этих данных...
- Подключитесь к SQL-консоли
Если вам нужно подключение клиента SQL, ваша служба ClickHouse Cloud имеет ассоциированную веб-основу SQL консоли; разверните Подключиться к SQL консоли ниже для подробностей.
Подключиться к SQL консоли
Из вашего списка служб ClickHouse Cloud нажмите на службу.

Это перенаправит вас в SQL консоль.

Если вы используете self-managed ClickHouse, вы можете подключиться к SQL-консоли по адресу https://hostname:8443/play (узнайте у вашего администратора ClickHouse все детали).
- Создайте следующую таблицу
tripsв базе данныхdefault:
2. Вставьте набор данных
Теперь, когда у вас есть созданная таблица, давайте добавим данные такси NYC. Они находятся в CSV файлах на S3, и вы можете загрузить данные оттуда.
-
Следующая команда вставляет ~2,000,000 строк в вашу таблицу
tripsиз двух различных файлов на S3:trips_1.tsv.gzиtrips_2.tsv.gz: -
Подождите, пока операция
INSERTзавершится - это может занять некоторое время для загрузки 150 МБ данных.примечаниеФункция
s3умело знает, как распаковать данные, а форматTabSeparatedWithNamesсообщает ClickHouse, что данные разделены табуляцией, а также что нужно пропустить заголовок каждой строки файла. -
Когда вставка завершится, убедитесь, что все прошло успешно:
Вы должны увидеть около 2M строк (1,999,657 строк, если быть точным).
примечаниеОбратите внимание, как быстро и как немного строк ClickHouse пришлось обработать для определения общего количества? Вы можете получить количество всего за 0.001 секунды с обработкой только 6 строк.
-
Если вы выполните запрос, который должен обработать каждую строку, вы заметите, что обработано значительно больше строк, но время выполнения по-прежнему будет молниеносным:
Этот запрос должен обработать 2M строк и вернуть 190 значений, но обратите внимание, что он делает это за около 1 секунды. Колонка
pickup_ntanameпредставляет собой название района в Нью-Йорке, откуда началась поездка на такси.
3. Анализ данных
Давайте выполнем некоторые запросы для анализа 2M строк данных...
-
Начнем с простых расчетов, например, вычислим среднюю сумму чаевых:
Ответ будет:
-
Этот запрос вычисляет среднюю стоимость на основе количества пассажиров:
passenger_countварьируется от 0 до 9: -
Вот запрос, который вычисляет количество подач такси по районам:
Результат будет выглядеть так:
-
Этот запрос вычисляет длину поездки и группирует результаты по этому значению:
Результат будет выглядеть так:
-
Этот запрос показывает количество подач такси в каждом районе, разбитое по часам дня:
Результат будет выглядеть так:
-
Давайте посмотрим на поездки в аэропорты ЛаГвардия или JFK:
Ответ будет:
4. Создайте словарь
Если вы новичок в ClickHouse, важно понимать, как работают словаря. Простым способом думать о словаре является отображение пар ключ->значение, которое хранится в памяти. Подробности и все варианты для словарей приведены в конце учебника.
- Давайте посмотрим, как создать словарь, связанный с таблицей в вашем сервисе ClickHouse. Таблица и, следовательно, словарь будут основаны на CSV файле, который содержит 265 строк, по одной строке для каждого района Нью-Йорка. Районы сопоставлены с названиями боро Нью-Йорка (в Нью-Йорке 5 боро: Бронкс, Бруклин, Манхэттен, Квинс и Стейтен-Айленд), и этот файл также считает аэропорт Ньюарка (EWR) боро.
Это часть CSV файла (представленная в виде таблицы для ясности). Колонка LocationID в файле сопоставляется с колонками pickup_nyct2010_gid и dropoff_nyct2010_gid в вашей таблице trips:
| LocationID | Borough | Zone | service_zone |
|---|---|---|---|
| 1 | EWR | Newark Airport | EWR |
| 2 | Queens | Jamaica Bay | Boro Zone |
| 3 | Bronx | Allerton/Pelham Gardens | Boro Zone |
| 4 | Manhattan | Alphabet City | Yellow Zone |
| 5 | Staten Island | Arden Heights | Boro Zone |
- URL для файла
https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/taxi_zone_lookup.csv. Запустите следующий SQL, который создает словарь с именемtaxi_zone_dictionaryи заполняет словарь из CSV файла на S3:
Установка LIFETIME в 0 означает, что этот словарь никогда не будет обновляться с его источника. Он используется здесь, чтобы не отправлять ненужный трафик в наш S3 бакет, но в общем вы можете указать любые значения времени жизни, которые вам нравятся.
Например:
указывает словарю обновляться через произвольное время между 1 и 10 секундами. (Произвольное время необходимо для распределения нагрузки на источник словаря при обновлении на большом количестве серверов.)
-
Убедитесь, что это сработало - вы должны получить 265 строк (по одной строке для каждого района):
-
Используйте функцию
dictGet(или ее вариации), чтобы получить значение из словаря. Вы передаете имя словаря, значение, которое хотите, и ключ (который в нашем примере является колонкойLocationIDсловаряtaxi_zone_dictionary).Например, следующий запрос возвращает
Borough, чейLocationIDравен 132 (что, как мы видели выше, является аэропортом JFK):JFK находится в Квинсе, и обратите внимание, что время на получение значения фактически равно 0:
-
Используйте функцию
dictHas, чтобы узнать, присутствует ли ключ в словаре. Например, следующий запрос возвращает 1 (что является "true" в ClickHouse): -
Следующий запрос возвращает 0, потому что 4567 не является значением
LocationIDв словаре: -
Используйте функцию
dictGet, чтобы получить название района в запросе. Например:Этот запрос суммирует количество поездок на такси по боро, которые заканчиваются либо в аэропорту ЛаГвардия, либо в JFK. Результат выглядит следующим образом, и обратите внимание, что есть довольно много поездок, где район подачи неизвестен:
5. Выполните Join
Давайте напишем несколько запросов, которые объединяют taxi_zone_dictionary с вашей таблицей trips.
-
Мы можем начать с простого JOIN, который действует аналогично предыдущему запросу об аэропортах:
Ответ будет выглядеть знакомо:
примечаниеОбратите внимание, что вывод запроса
JOINвыше такой же, как и в запросе, который использовалdictGetOrDefault(за исключением того, что значенияUnknownне включены). За кулисами ClickHouse фактически вызывает функциюdictGetдля словаряtaxi_zone_dictionary, но синтаксисJOINболее привычен для разработчиков SQL. -
Мы не используем
SELECT *часто в ClickHouse - вы должны получать только те колонки, которые вам действительно нужны! Но трудно найти запрос, который занимает много времени, поэтому этот запрос намеренно выбирает каждую колонку и возвращает каждую строку (за исключением встроенного максимума в 10,000 строк в ответе по умолчанию), а также выполняет правое соединение каждой строки со словарем:
Поздравляем!
Отлично - вы справились с учебником, и надеемся, у вас появилось лучшее понимание использования ClickHouse. Вот несколько вариантов, что делать дальше:
- Прочитайте как работают первичные ключи в ClickHouse - эти знания помогут вам значительно продвинуться к тому, чтобы стать экспертом по ClickHouse
- Интегрируйте внешний источник данных, такие как файлы, Kafka, PostgreSQL, конвейеры данных или множество других источников данных
- Подключите любимый инструмент UI/BI к ClickHouse
- Ознакомьтесь с SQL справочником и просмотрите различные функции. У ClickHouse есть удивительная коллекция функций для преобразования, обработки и анализа данных
- Узнайте больше о Словарях