В этом руководстве вы узнаете, как с помощью ClickHouse выполнять аналитические запросы к большим объёмам данных.
Кроме того, вы научитесь обогащать данные с помощью словаря и писать запросы с JOIN.
Предварительные требования
Для работы с этим руководством вам понадобится:- Аккаунт ClickHouse Cloud (при регистрации начисляется 300 $ в виде бесплатных кредитов)
- Сервис ClickHouse Cloud
Создайте таблицу
В этом руководстве используется набор данных о поездках на такси в Нью-Йорке. Он содержит сведения о миллионах поездок и включает такие столбцы, как размер чаевых, дорожные сборы, способ оплаты и другие.
- Выберите SQL console в меню слева
- Нажмите на вкладку + рядом со значком домашней страницы, чтобы создать новый запрос
- Введите следующий запрос в редакторе SQL и нажмите Run:
Expandable
Вставьте данные
Теперь, когда таблица создана, загрузите в неё данные о поездках на такси в Нью-Йорке из CSV-файлов в S3.Следующая команда вставляет около 2 000 000 строк в таблицу trips из двух файлов в S3 — Дождитесь окончания вставки данных. Будет загружено около 150 МБ данных.
Когда вставка завершится, проверьте количество строк в таблице В результате должно получиться 1 999 657 строк
trips_1.tsv.gz и trips_2.tsv.gz:Expandable
trips:Проанализируйте данные
После загрузки данных можно выполнить несколько запросов для их анализа.
-
Рассчитайте средний размер чаевых:
-
Рассчитайте среднюю стоимость поездки в зависимости от количества пассажиров:
-
Рассчитайте ежедневное количество посадок пассажиров по районам:
-
Рассчитайте продолжительность каждой поездки в минутах и сгруппируйте результаты по продолжительности:
-
Выведите количество посадок пассажиров в каждом районе с разбивкой по часам суток:
Создайте словарь
Далее вы создадите словарь (набор пар ключ-значение, хранящийся в памяти) с именем Убедитесь, что всё работает. Следующий запрос должен вернуть 265 строк — по одной для каждого района:
taxi_zone_dictionary, который сопоставляет идентификаторы местоположений с названиями боро Нью-Йорка. Источником данных служит CSV-файл со списком всех районов Нью-Йорка.
Эти идентификаторы соответствуют столбцам pickup_nyct2010_gid и dropoff_nyct2010_gid в таблице trips.Ниже приведён фрагмент используемого CSV-файла в табличном виде. Столбец LocationID в файле соответствует столбцам pickup_nyct2010_gid и dropoff_nyct2010_gid в вашей таблице trips:Выполните следующую 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.Выполняйте запросы с помощью словаря
Чтобы получить значение из словаря, используйте функцию JFK находится в Куинсе. Обратите внимание, что время получения значения практически нулевое:Чтобы проверить, есть ли ключ в словаре, используйте функцию Следующий запрос возвращает 0, так как в словаре нет значения Чтобы получить название боро в запросе, используйте функцию Этот запрос подсчитывает количество поездок на такси по каждому боро, завершившихся в аэропорту LaGuardia или JFK. Результат выглядит следующим образом. Обратите внимание, что для довольно большого числа поездок район посадки неизвестен:
dictGet (или её разновидности).
Передайте ей имя словаря, имя нужного значения и ключ (в нашем примере это столбец LocationID словаря taxi_zone_dictionary) — и функция вернёт соответствующее значение.
Например, следующий запрос возвращает Borough для LocationID, равного 132 (это аэропорт JFK):dictHas. Например, следующий запрос возвращает 1 (в ClickHouse это означает “true”):LocationID, равного 4567:dictGet. Например:Выполнить JOIN
Наконец, напишите несколько запросов, которые выполняют JOIN словаря Результат выглядит так же, как и для запроса с Этот запрос возвращает строки для 1000 поездок с наибольшей суммой чаевых, а затем выполняет внутреннее соединение (INNER JOIN) каждой строки со словарём:
taxi_zone_dictionary с вашей таблицей trips.Начните с простого JOIN, работающего аналогично предыдущему запросу по аэропортам:dictGet:Обратите внимание, что результат приведённого выше запроса с
JOIN совпадает с результатом предыдущего запроса, в котором использовалась функция dictGetOrDefault (за исключением того, что значения Unknown в него не попали).
На самом деле под капотом ClickHouse вызывает функцию dictGet для словаря taxi_zone_dictionary, однако синтаксис JOIN привычнее для SQL-разработчиков.Дальнейшие шаги
Подробнее о ClickHouse читайте в следующих разделах документации:- Введение в первичные индексы в ClickHouse: узнайте, как ClickHouse использует разреженные первичные индексы для эффективного поиска нужных данных при выполнении запросов.
- Интеграция внешнего источника данных: ознакомьтесь с вариантами интеграции источников данных, включая файлы, Kafka, PostgreSQL, конвейеры данных и многое другое.
- Визуализация данных в ClickHouse: подключите к ClickHouse свой любимый инструмент визуализации или BI.
- Справочник по ClickHouse SQL: изучите SQL-функции ClickHouse для преобразования, обработки и анализа данных.