Расширенное руководство
Overview
Узнайте, как выполнять приём и запросы данных в ClickHouse на примере набора данных о такси Нью-Йорка.
Prerequisites
Для выполнения данного руководства необходим доступ к работающему сервису ClickHouse. Инструкции см. в руководстве Быстрый старт.
Создание новой таблицы
Набор данных о такси Нью‑Йорка содержит сведения о миллионах поездок, включая такие столбцы, как сумма чаевых, платные дороги, тип оплаты и многое другое. Создайте таблицу для хранения этих данных.
-
Подключитесь к SQL‑консоли:
- Для ClickHouse Cloud выберите сервис в раскрывающемся списке, затем выберите SQL Console в левой панели навигации.
- Для самостоятельно развернутого ClickHouse подключитесь к SQL‑консоли по адресу
https://_hostname_:8443/play. Уточните детали у администратора ClickHouse.
-
Создайте следующую таблицу
tripsв базе данныхdefault:
Добавьте набор данных
Теперь, когда вы создали таблицу, добавьте данные о такси Нью‑Йорка из CSV‑файлов в S3.
-
Следующая команда вставляет примерно 2 000 000 строк в таблицу
tripsиз двух разных файлов в S3:trips_1.tsv.gzиtrips_2.tsv.gz: -
Дождитесь завершения выполнения команды
INSERT. Загрузка 150 МБ данных может занять некоторое время. -
После завершения вставки убедитесь, что она прошла успешно:
Этот запрос должен вернуть 1 999 657 строк.
Анализ данных
Выполните несколько запросов для анализа данных. Изучите следующие примеры или попробуйте свой собственный SQL-запрос.
-
Вычислите средний размер чаевых:
Ожидаемый результат
-
Рассчитайте среднюю стоимость поездки в зависимости от количества пассажиров:
Ожидаемый результат
Значения
passenger_countпринимают значения от 0 до 9: -
Рассчитайте ежедневное число посадок такси по районам:
Ожидаемый результат
-
Вычислите продолжительность каждой поездки в минутах, затем сгруппируйте результаты по продолжительности поездки:
Ожидаемый результат
-
Выведите количество посадок такси в каждом районе с разбивкой по часам суток:
Ожидаемый результат
-
Извлечь записи о поездках до аэропортов Ла‑Гуардия или JFK:
Ожидаемый результат
Создайте словарь
Словарь — это хранящееся в памяти отображение пар ключ-значение. Подробности см. в разделе Словари
Создайте словарь, связанный с таблицей в вашем сервисе ClickHouse. Таблица и словарь основаны на CSV-файле, который содержит строку для каждого района Нью-Йорка.
Районы сопоставлены с названиями пяти районов (боро) Нью‑Йорка (Бронкс, Бруклин, Манхэттен, Куинс и Статен‑Айленд), а также с аэропортом Ньюарк (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 |
- Выполните следующий SQL‑запрос, который создаёт словарь с именем
taxi_zone_dictionaryи заполняет его данными из CSV‑файла в S3. URL файла:https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/taxi_zone_lookup.csv.
Установка LIFETIME в 0 отключает автоматические обновления, чтобы избежать ненужного трафика к нашему S3 бакету. В других случаях вы можете настроить это по‑другому. Подробности см. в разделе Обновление данных словаря с помощью LIFETIME.
-
Убедитесь, что всё работает. Следующий запрос должен вернуть 265 строк — по одной для каждого района:
-
Используйте функцию
dictGet(или ее варианты), чтобы извлечь значение из словаря. Вы передаете имя словаря, требуемое значение и ключ (в нашем примере это столбецLocationIDсловаряtaxi_zone_dictionary).Например, следующий запрос возвращает
Borough, для которогоLocationIDравен 132, что соответствует аэропорту JFK):JFK находится в Куинсе. Обратите внимание, что время выборки значения практически равно 0:
-
Используйте функцию
dictHas, чтобы проверить, присутствует ли ключ в словаре. Например, следующий запрос возвращает1(в ClickHouse это означает «true»): -
Следующий запрос вернёт 0, потому что 4567 не является значением поля
LocationIDв словаре: -
Используйте функцию
dictGet, чтобы получить название боро в запросе. Например:Этот запрос подсчитывает общее количество поездок на такси по районам для поездок, которые заканчиваются либо в аэропорту LaGuardia, либо в аэропорту JFK. Результат выглядит следующим образом — обратите внимание, что есть довольно много поездок с неизвестным районом отправления:
Выполнение соединения
Напишите несколько запросов, которые объединяют taxi_zone_dictionary с вашей таблицей trips.
-
Начните с простого
JOIN, который будет работать аналогично предыдущему запросу к данным об аэропортах выше:Ответ идентичен ответу на запрос
dictGet:ПримечаниеОбратите внимание, что результат приведённого выше запроса с
JOINсовпадает с запросом до него, который использовалdictGetOrDefault(за исключением того, что значенияUnknownне возвращаются). Под капотом ClickHouse фактически вызывает функциюdictGetдля словаряtaxi_zone_dictionary, но синтаксисJOINболее привычен для разработчиков SQL. -
Этот запрос возвращает строки для 1000 поездок с наибольшей суммой чаевых, затем выполняет внутреннее соединение каждой из этих строк со словарём:
ПримечаниеКак правило, в ClickHouse мы избегаем частого использования
SELECT *. Следует извлекать только те столбцы, которые вам действительно нужны.
Дальнейшие шаги
Узнайте больше о ClickHouse из следующих разделов документации:
- Введение в первичные индексы в ClickHouse: Узнайте, как ClickHouse использует разрежённые первичные индексы для эффективного поиска релевантных данных при выполнении запросов.
- Интеграция внешнего источника данных: Ознакомьтесь с вариантами интеграции источников данных, включая файлы, Kafka, PostgreSQL, конвейеры обработки данных и многие другие.
- Визуализация данных в ClickHouse: Подключите любимый UI/BI‑инструмент к ClickHouse.
- Справочник по SQL: Просмотрите доступные в ClickHouse функции SQL для преобразования, обработки и анализа данных.