Продвинутое руководство
Обзор
Узнайте, как загружать и запрашивать данные в ClickHouse, используя в качестве примера набор данных такси Нью-Йорка.
Предварительные условия
Вам нужен доступ к работающему сервису 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:
- Рассчитайте ежедневное количество поднятий по районам:
Ожидаемый вывод
- Рассчитайте продолжительность каждой поездки в минутах, затем сгруппируйте результаты по длине поездки:
Ожидаемый вывод
- Покажите количество поднятий в каждом районе по часам суток:
Ожидаемый вывод
- Получите поездки в аэропорты ЛаGuardia или 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):
- Следующий запрос возвращает 0, потому что 4567 не является значением
LocationID
в словаре:
- Используйте функцию
dictGet
, чтобы извлечь название района в запросе. Например:
Этот запрос суммирует количество поездок на такси по районам, которые заканчиваются в аэропортах ЛаGuardia или 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-функциями для преобразования, обработки и анализа данных.