Продвинутое руководство
Обзор
Узнайте, как загружать и запрашивать данные в 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-функциями для преобразования, обработки и анализа данных.