Расширенный учебник
Чего ожидать от этого учебника?
В этом учебнике вы создадите таблицу и вставите большой набор данных (два миллиона строк из данных такси Нью-Йорка). Затем вы выполните запросы к набору данных, включая пример того, как создать словарь и использовать его для выполнения 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 есть удивительная коллекция функций для преобразования, обработки и анализа данных
- Узнайте больше о Словарях