Расширенный учебник
Обзор
Узнайте, как загружать и выполнять запросы к данным в ClickHouse на примере набора данных такси Нью-Йорка.
Предварительные условия
Вам нужен доступ к работающему сервису ClickHouse, чтобы завершить этот учебник. Для инструкций смотрите руководство Быстрый старт.
Создать новую таблицу
Набор данных такси Нью-Йорка содержит информацию о миллионах поездок на такси, с колонками, включая сумму чаевых, сборы, тип оплаты и многое другое. Создайте таблицу для хранения этих данных.
- Подключитесь к SQL-консоли:
- Для ClickHouse Cloud выберите сервис из выпадающего меню, а затем выберите SQL Консоль в левом навигационном меню.
- Для самоуправляемого 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 | Аэропорт Ньюарк | EWR |
2 | Квинс | Зона Ямайка | Boro Zone |
3 | Бронкс | Allerton/Pelham Gardens | Boro Zone |
4 | Манхэттен | Алфавитный город | Yellow Zone |
5 | Стейтен-Айленд | Арден Хейтс | 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
(это "true" в ClickHouse): -
Следующий запрос возвращает 0, потому что 4567 не является значением
LocationID
в словаре: -
Используйте функцию
dictGet
, чтобы извлечь имя района в запросе. Например:Этот запрос суммирует количество поездок на такси по районам, которые заканчиваются либо в аэропорту ЛаГардиа, либо 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-функциями для преобразования, обработки и анализа данных.