Расширенный учебник
Обзор
Узнайте, как загружать и выполнять запросы к данным в ClickHouse на примере набора данных такси Нью-Йорка.
Предварительные условия
Вам нужен доступ к работающему сервису ClickHouse, чтобы завершить этот учебник. Для инструкций смотрите руководство Быстрый старт.
Создать новую таблицу
Набор данных такси Нью-Йорка содержит информацию о миллионах поездок на такси, с колонками, включая сумму чаевых, сборы, тип оплаты и многое другое. Создайте таблицу для хранения этих данных.
- Подключитесь к SQL-консоли:
- Для ClickHouse Cloud выберите сервис из выпадающего меню, а затем выберите SQL Консоль в левом навигационном меню.
- Для самоуправляемого ClickHouse подключитесь к SQL-консоли по адресу https://_hostname_:8443/play. Проверьте детали у вашего администратора ClickHouse.
- Создайте следующую таблицу tripsв базе данныхdefault:
- 
Подождите, пока 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-функциями для преобразования, обработки и анализа данных.
