Перейти к основному содержанию

Обзор

Это руководство следует [руководству по ClickHouse], но все запросы в нем выполняются через pg_clickhouse.

Запустите ClickHouse

Сначала создайте базу данных ClickHouse, если у вас её ещё нет. Быстро начать можно с Docker-образа:

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

Давайте воспользуемся [руководством по ClickHouse], чтобы создать простую базу данных с набором данных о такси в Нью-Йорке:

Добавьте набор данных

Затем импортируйте данные:
Убедитесь, что запросы к нему выполняются, затем выйдите из клиента:

Установите pg_clickhouse

Соберите и установите pg_clickhouse из PGXN или GitHub. Либо запустите Docker-контейнер с [образом pg_clickhouse], который просто добавляет pg_clickhouse в Docker-[образ Postgres]:

Подключение pg_clickhouse

Теперь подключитесь к Postgres:
Затем создайте pg_clickhouse:
Создайте внешний сервер, указав имя хоста, порт и имя базы данных вашей базы данных ClickHouse.
Здесь мы решили использовать бинарный драйвер, который работает по бинарному протоколу ClickHouse. Вы также можете использовать драйвер “http”, который работает через HTTP-интерфейс. Далее свяжите пользователя PostgreSQL с пользователем ClickHouse. Самый простой способ сделать это — просто сопоставить текущего пользователя PostgreSQL с удалённым пользователем для стороннего сервера:
Вы также можете указать параметр password. Теперь добавьте таблицу taxi — просто импортируйте все таблицы из удалённой базы данных ClickHouse в схему Postgres:
И теперь таблица должна быть уже импортирована: в psql используйте \det+, чтобы её увидеть:
Готово! Используйте \d, чтобы вывести все столбцы:
Теперь выполните запрос к таблице:
Обратите внимание, как быстро выполнился запрос. pg_clickhouse целиком передаёт выполнение запроса, включая агрегат COUNT(), в ClickHouse, поэтому в Postgres возвращается только одна строка. Чтобы убедиться в этом, используйте EXPLAIN:
Обратите внимание, что “Foreign Scan” находится в корне плана, то есть весь запрос был отправлен в ClickHouse.

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

Выполните несколько запросов, чтобы проанализировать данные. Ознакомьтесь со следующими примерами или попробуйте собственный SQL-запрос.
  • Рассчитайте среднюю сумму чаевых:
  • Рассчитайте среднюю стоимость в зависимости от количества пассажиров:
  • Рассчитайте ежедневное число посадок по районам:
  • Вычислите длительность каждой поездки в минутах, затем сгруппируйте результаты по длительности поездок:
  • Покажите число посадок в каждом районе с разбивкой по часам суток:
  • Установите часовой пояс отображения для Нью-Йорка и получите данные о поездках в аэропорты Ла-Гуардия или JFK:

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

Создайте словарь, связанный с таблицей в вашем сервисе ClickHouse. Таблица и словарь основаны на CSV-файле, который содержит по одной строке для каждого района Нью-Йорка. Эти районы сопоставлены с названиями пяти боро Нью-Йорка (Bronx, Brooklyn, Manhattan, Queens и Staten Island), а также с аэропортом Newark Airport (EWR). Ниже приведён фрагмент используемого CSV-файла в табличном формате. Столбец LocationID в файле сопоставляется со столбцами pickup_nyct2010_gid и dropoff_nyct2010_gid в таблице поездок:
  1. По-прежнему в Postgres используйте функцию clickhouse_raw_query, чтобы создать в ClickHouse [словарь] с именем taxi_zone_dictionary и заполнить его данными из CSV-файла в S3:
Значение LIFETIME, равное 0, отключает автоматические обновления, чтобы избежать лишнего трафика к нашему S3 бакету. В других случаях вы можете настроить его иначе. Подробнее см. в разделе Обновление данных словаря с помощью LIFETIME.
  1. Теперь импортируйте его:
  1. Убедитесь, что запрос к нему выполняется:
  1. Отлично. Теперь используйте функцию dictGet, чтобы получить название боро в запросе. Этот запрос суммирует количество поездок на такси по каждому боро, которые заканчиваются либо в аэропорту LaGuardia, либо в JFK:
Этот запрос подсчитывает количество поездок на такси по каждому боро, которые заканчиваются в аэропорту Ла-Гуардия или JFK. Обратите внимание, что довольно много поездок, в которых район посадки неизвестен.

Выполните JOIN

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