Расширенное руководство
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:
Ожидаемый результат
Создание словаря
Словарь — это отображение пар «ключ-значение», хранящихся в памяти. Подробности см. в разделе Dictionaries.
Создайте словарь, связанный с таблицей в вашем сервисе ClickHouse. Таблица и словарь основаны на CSV‑файле, который содержит строку для каждого района (neighborhood) Нью‑Йорка.
Районы сопоставляются с названиями пяти боро Нью‑Йорка (Bronx, Brooklyn, Manhattan, Queens и Staten Island), а также аэропорта Newark (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‑бакет. В других случаях вы можете настроить это по‑другому. Подробности см. в разделе Refreshing dictionary data using 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 поездок с наибольшей суммой чаевых, затем выполняет внутреннее соединение каждой строки со словарём:
ПримечаниеКак правило, следует избегать частого использования
SELECT *в ClickHouse. Извлекайте только те столбцы, которые действительно необходимы.
Дальнейшие шаги
Узнайте больше о ClickHouse из следующих разделов документации:
- Введение в первичные индексы в ClickHouse: Узнайте, как ClickHouse использует разрежённые первичные индексы для эффективного поиска релевантных данных при выполнении запросов.
- Интеграция внешнего источника данных: Ознакомьтесь с вариантами интеграции источников данных, включая файлы, Kafka, PostgreSQL, конвейеры обработки данных и многие другие.
- Визуализация данных в ClickHouse: Подключите любимый UI/BI‑инструмент к ClickHouse.
- Справочник по SQL: Просмотрите доступные в ClickHouse функции SQL для преобразования, обработки и анализа данных.