Skip to main content
В этом руководстве вы узнаете, как с помощью ClickHouse выполнять аналитические запросы к большим объёмам данных. Кроме того, вы научитесь обогащать данные с помощью словаря и писать запросы с JOIN.

Предварительные требования

Для работы с этим руководством вам понадобится:
1

Создайте таблицу

В этом руководстве используется набор данных о поездках на такси в Нью-Йорке. Он содержит сведения о миллионах поездок и включает такие столбцы, как размер чаевых, дорожные сборы, способ оплаты и другие.
  1. Выберите SQL console в меню слева
  2. Нажмите на вкладку + рядом со значком домашней страницы, чтобы создать новый запрос
  3. Введите следующий запрос в редакторе SQL и нажмите Run:
Expandable
2

Вставьте данные

Теперь, когда таблица создана, загрузите в неё данные о поездках на такси в Нью-Йорке из CSV-файлов в S3.Следующая команда вставляет около 2 000 000 строк в таблицу trips из двух файлов в S3 — trips_1.tsv.gz и trips_2.tsv.gz:
Expandable
Дождитесь окончания вставки данных. Будет загружено около 150 МБ данных. Когда вставка завершится, проверьте количество строк в таблице trips:
В результате должно получиться 1 999 657 строк
3

Проанализируйте данные

После загрузки данных можно выполнить несколько запросов для их анализа.
  • Рассчитайте средний размер чаевых:
  • Рассчитайте среднюю стоимость поездки в зависимости от количества пассажиров:
  • Рассчитайте ежедневное количество посадок пассажиров по районам:
  • Рассчитайте продолжительность каждой поездки в минутах и сгруппируйте результаты по продолжительности:
  • Выведите количество посадок пассажиров в каждом районе с разбивкой по часам суток:
4

Создайте словарь

Далее вы создадите словарь (набор пар ключ-значение, хранящийся в памяти) с именем 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.
Убедитесь, что всё работает. Следующий запрос должен вернуть 265 строк — по одной для каждого района:
5

Выполняйте запросы с помощью словаря

Чтобы получить значение из словаря, используйте функцию dictGet (или её разновидности). Передайте ей имя словаря, имя нужного значения и ключ (в нашем примере это столбец LocationID словаря taxi_zone_dictionary) — и функция вернёт соответствующее значение. Например, следующий запрос возвращает Borough для LocationID, равного 132 (это аэропорт JFK):
JFK находится в Куинсе. Обратите внимание, что время получения значения практически нулевое:
Чтобы проверить, есть ли ключ в словаре, используйте функцию dictHas. Например, следующий запрос возвращает 1 (в ClickHouse это означает “true”):
Следующий запрос возвращает 0, так как в словаре нет значения LocationID, равного 4567:
Чтобы получить название боро в запросе, используйте функцию dictGet. Например:
Этот запрос подсчитывает количество поездок на такси по каждому боро, завершившихся в аэропорту LaGuardia или JFK. Результат выглядит следующим образом. Обратите внимание, что для довольно большого числа поездок район посадки неизвестен:
6

Выполнить JOIN

Наконец, напишите несколько запросов, которые выполняют JOIN словаря taxi_zone_dictionary с вашей таблицей trips.Начните с простого JOIN, работающего аналогично предыдущему запросу по аэропортам:
Результат выглядит так же, как и для запроса с dictGet:
Обратите внимание, что результат приведённого выше запроса с JOIN совпадает с результатом предыдущего запроса, в котором использовалась функция dictGetOrDefault (за исключением того, что значения Unknown в него не попали). На самом деле под капотом ClickHouse вызывает функцию dictGet для словаря taxi_zone_dictionary, однако синтаксис JOIN привычнее для SQL-разработчиков.
Этот запрос возвращает строки для 1000 поездок с наибольшей суммой чаевых, а затем выполняет внутреннее соединение (INNER JOIN) каждой строки со словарём:
Вместо SELECT * лучше перечислять только те столбцы, которые действительно нужны запросу. Поскольку ClickHouse хранит данные по столбцам, чем меньше столбцов вы выбираете, тем меньше данных приходится читать, распаковывать и обрабатывать.

Дальнейшие шаги

Подробнее о ClickHouse читайте в следующих разделах документации:
Последнее изменение 28 сентября 2026 г.