Skip to main content

Краткое описание

Описание

Модуль chdb_hook встраивается в команду PostgreSQL COPY, позволяя с помощью chDB копировать данные TO или FROM в любом из поддерживаемых форматов данных, предоставляемых chDB, — в локальные файлы, бакеты AWS S3, Google Cloud Storage и другие хранилища. Он также встраивается в CREATE TABLE, благодаря чему таблица может получить описание своих столбцов и загрузить строки из любого из тех же источников.

Загрузка

Загрузите chdb_hook одним из следующих способов от имени суперпользователя. Выберите тот, который лучше всего подходит для вашего сценария:
  • Явно, командой LOAD; действует на протяжении сеанса:
    SQL Console в ClickHouse Cloud пока не поддерживает команду LOAD 'chdb_hook', однако её можно выполнить через psql или любое другое подключение к базе данных. Либо обратитесь к своему представителю службы поддержки, чтобы её добавили в конфигурацию вашего сервиса Postgres, после чего её можно будет использовать в SQL Console.
  • Для всех сеансов — с помощью настройки [session_preload_libraries] в postgresql.conf:
    Или через ALTER SYSTEM:
    Эту настройку можно задать и на уровне отдельной базы данных с помощью ALTER DATABASE:
    Или для конкретных пользователей и групп с помощью ALTER ROLE:
  • При запуске сервера — с помощью настройки [shared_preload_libraries], чтобы расширение всегда было доступно во всех сеансах и базах данных:
Учтите, что загрузка chdb_hook даёт пользователям с ролями pg_read_server_files или pg_write_server_files возможность выполнять COPY данных из файлов и в файлы на сервере Postgres, а также в облачное хранилище.

Перегрузка COPY

При загрузке chdb_hook встраивается в команду Postgres COPY, что позволяет копировать данные TO или FROM в любом из поддерживаемых форматов данных, предоставляемых chDB, — в локальные файлы, бакеты AWS S3, Google Cloud Storage и другие хранилища. Например, чтобы загрузить таблицу из CSV-файла в S3, создайте таблицу, а затем вызовите COPY, указав URL вида s3://:

Привилегии

Для COPY с chdb_hook требуются те же привилегии, что и для заменяемой им команды COPY: SELECT на отношение или на каждый копируемый столбец для COPY TO и INSERT для COPY FROM. URL вида file:// читает или записывает файл на сервере, поэтому также требуется членство в pg_read_server_files или pg_write_server_files. Для COPY FROM требуется транзакция с возможностью чтения и записи.

Схемы URL

chdb_hook выполняется только для тех целей COPY в виде URL, которые используют одну из следующих схем:

Форматы URL

Формат URL зависит от целевой системы (target).

File

Должен быть абсолютным путём на сервере Postgres. Относительный путь приводит к ошибке. Пользователь Postgres должен входить в роль pg_read_server_files или pg_write_server_files — в зависимости от ситуации. Системный пользователь Postgres должен иметь доступ к файлу на чтение или запись — в зависимости от ситуации. Для COPY TO, если путь не существует, chdb_hook создаст все отсутствующие родительские каталоги; для этого у него должны быть соответствующие разрешения в файловой системе. Пример:

HTTP

Любой обычный HTTP URL, в том числе в публичном облачном хранилище. Для COPY TO chdb_hook попытается отправить данные на этот URL методом POST. Пример:

S3

URL-адреса S3 могут иметь форму S3 URI
Либо URL объекта:

GCS

URL для GCS имеют форму публичного URL:
Либо URI облачного хранилища, который chdb_hook преобразует в публичный URL:

Azure Blob Storage

Используйте URL вида blob.windows.net, указав имя аккаунта в качестве субдомена:
Либо используйте другое имя хоста:

Azure ABFS

URL-адреса ABFS должны иметь следующий формат:

URL-адреса HDFS

URL-адреса HDFS могут задаваться в обычном HTTP-подобном формате с необязательным указанием порта:

Подстановочные шаблоны в путях

URL-пути в командах COPY FROM могут содержать глоб-шаблоны. Файлы должны соответствовать шаблону пути целиком, а не только его суффиксу или префиксу. Единственное исключение: если путь указывает на существующий каталог и не содержит глоб-шаблонов, к пути неявно добавляется *, чтобы выбрать все файлы в этом каталоге. Поддерживаемые подстановочные шаблоны:
  • *: соответствует произвольному количеству символов, кроме /, включая пустую строку.
  • ?: соответствует любому одиночному символу.
  • {groucho,harpo,chico}: подставляет любую из строк «groucho», «harpo» и «chico». Строки могут содержать /.
  • {N..M}: соответствует любому числу >= N и <= M.
  • **: рекурсивно соответствует всем файлам в каталоге.
Например, чтобы загрузить данные из этих файлов одной командой: Используйте {some,another}_prefix, чтобы охватить оба имени каталогов, и some_file_{1..3}.csv', чтобы охватить нужные файлы — вот так:

Параметры

Команда COPY в chdb_hook поддерживает следующие параметры:

format:

Формат для чтения или записи. Должен быть одним из formats, поддерживаемых chDB, среди которых TSV, CSV, Parquet, Iceberg, JSON и другие. Опустите этот параметр или задайте значение auto, чтобы chDB определил формат по расширению имени файла в конце URL.

structure

Структура данных chDB для строки. Состоит из списка имён столбцов, [типов данных ClickHouse] и модификаторов. Если параметр не указан, chdb_hook сопоставляет типы данных Postgres с наиболее подходящими типами ClickHouse; подробнее см. Postgres в chDB. Если задано значение auto, chDB пытается определить типы автоматически. Пример:

access_key и access_secret

Долгосрочные учётные данные пользователя AWS account для аутентификации запросов.
  • S3: AWS [ключ доступа ID и access secret], которые чаще всего задаются переменными окружения AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY
  • GCS: GCP HMAC key and secret
  • Azure: имя Azure Storage account и [ключ доступа]

session_token

Сеансовый токен AWS, используемый вместе с access_key и access_secret; часто задаётся переменной окружения AWS_SESSION_TOKEN. Применяется только для URL-адресов S3.

compression

Формат сжатия файла. Используйте, если сжатие нельзя определить по имени файла. Поддерживаемые значения:
  • auto (по умолчанию)
  • none
  • gzip или gz
  • brotli или br
  • xz или LZMA
  • zstd или zst
  • lz4
  • bz2
  • snappy

timeout

Тайм-аут запроса в миллисекундах. Применяется к URL-адресам HTTP, S3, GCS и Azure. Значение по умолчанию — 30000 (30 с).

Отладка

При ошибке команда COPY из chdb_hook добавляет в контекст ошибки запрос chDB, который она пыталась выполнить:
chdb_hook использует плейсхолдеры вида {name:Type} для параметров запроса, чтобы защититься от SQL-инъекций и снизить риск попадания в журнал конфиденциальных данных, например учётных данных. Если же вам нужно посмотреть содержимое этих параметров для отладки проблемы, временно задайте для GUC Postgres [log_min_messages] значение DEBUG1 или выше — тогда chdb_hook будет отправлять запрос и параметры в журнал Postgres (но никогда не клиенту), где они будут выглядеть так:
Не оставляйте [log_min_messages] на уровне отладки дольше, чем на один сеанс отладки: это позволит избежать попадания в журнал конфиденциальных данных, таких как учётные данные, к тому же PostgreSQL и сам пишет отладочную информацию и может быстро заполнить журнал.

Перегрузка CREATE TABLE

chdb_hook также встраивается в CREATE TABLE, благодаря чему таблица может получать свои столбцы и загружать строки из URL. Чтобы создать таблицу со структурой, полученной из URL, передайте URL в параметре structure_from и оставьте список столбцов пустым:
Используйте copy_from, чтобы загрузить не только столбцы, но и строки:
copy_from определяет столбцы автоматически только в том случае, если сам оператор не задаёт ни одного столбца. Список столбцов, clause INHERITS, тип в OF или партиция — каждый из них задаёт столбцы, поэтому в таком случае copy_from копирует только:
Оба варианта поддерживают те же URL schemes и options, что и COPY: учётные данные, format, сжатие, тайм-аут и даже явно заданная structure — всё это работает. Postgres сохраняет все оставшиеся storage parameters:
Ни structure_from, ни copy_from не работают с IF NOT EXISTS. Для загрузки существующего отношения используйте COPY.

Ограничения

Из-за ряда известных проблем и различий в поведении типов данных между Postgres и chDB у chdb_hook есть следующие ограничения:
  • Невозможно выполнить COPY для отношений с политиками [безопасность на уровне строк], которые применяются к копирующей роли. Postgres применяет такие политики, переписывая COPY TO в запрос, а chdb_hook этого не поддерживает.
  • В ClickHouse нет NULL-массива, поэтому вместо NULL COPY TO сохраняет пустой массив ([]).
  • ClickHouse представляет эквиваленты lseg, path и polygon в виде массивов, поэтому NULL-значения этих типов при COPY TO также превращаются в пустой массив ([]).
  • Если в заданной структуре столбец не определён как Nullable, NULL-значения будут выведены как значения по умолчанию. Всегда явно определяйте столбцы с типом Nullable в структуре, чтобы избежать такого преобразования.
  • Незамкнутый path, последняя точка которого совпадает с первой, выводится как замкнутый путь.
  • В Protobuf в повторяющемся поле нет null, поэтому NULL-значения в массивах опускаются.
  • JSON type в chDB поддерживает только объекты JSON; заменяйте отображение по умолчанию String для json и jsonb на JSON только в том случае, если все значения являются объектами JSON. (ClickHouse/ClickHouse#68428)
  • JSON type в chDB игнорирует null: ключи объекта со значениями NULL будут опущены при выводе. Заменяйте отображение по умолчанию String для json и jsonb на JSON только в том случае, если значения объекта не равны null либо их потеря допустима. (ClickHouse/ClickHouse#68428)
  • Форматы JSON, JSONCompact и JSONColumnsWithMetadata всегда проверяют UTF-8, поэтому выводят значения bytea с символами замены.
  • COPY FROM читает поле Protobuf Nullable, содержащее пустую строку или ноль, как NULL. (chdb-io/chdb-core#152)
  • COPY TO в Parquet отбрасывает NULL из собственного null map типа Nullable Tuple. (ClickHouse/ClickHouse#112427)
  • В форматах Parquet, Arrow, ArrowStream, ORC, Avro, Protobuf, ProtobufList, MsgPack и BSONEachRow нет типа, соответствующего time в Postgres или Time64 в chDB. Чтобы сохранить значения, задавайте столбцы time как String в явной структуре.
  • Вывод Protobuf усекает значения временных меток до секунд.
  • Вывод Protobuf не поддерживает даты ранее 1970-01-01. Чтобы сохранить значения, задавайте столбцы time как String в явной структуре. (ClickHouse/ClickHouse#111860)
  • Форматы CSVWithNames и CSVWithNamesAndTypes в настоящее время не могут импортировать NULL-значения box или circle. (ClickHouse/ClickHouse#115523)

Типы данных

COPY сопоставляет типы Postgres отношения с типами chDB, а CREATE TABLE — типы chDB для URL с типами Postgres.

Postgres в chDB

Если параметр structure не задан явно, chdb_hook сопоставляет типы Postgres с подходящими эквивалентами chDB. Если такое сопоставление не подходит для вашего сценария, укажите structure, чтобы заменить сгенерированные типы на нужные вам. Массивы сопоставляются с Array соответствующего типа элементов. В ClickHouse допустимость NULL задаётся для каждого столбца, а в Postgres — для всего массива, поэтому элементы всегда Nullable. Ни один тип Postgres не сопоставляется с Map или Tuple, однако structure может указать такой тип. Map можно преобразовать в массив пар «ключ — значение», а Tuple преобразуется в массив. Для поддержки разнородных данных используйте text[].

Преобразование временных меток

В текстовых форматах (TSV, CSV и др.) hook COPY выводит значения DateTime и DateTime64 в формате ISO-8601, YYYY-MM-DDThh:mm:ssZ, независимо от текущего значения настройки datestyle. Это гарантирует, что значения timestamptz останутся согласованными, даже если система, импортирующая эти значения, использует другой часовой пояс. Указание другого типа в выводе structure, например Datetime64(3, 'America/Los_Angeles'), не влияет на смещение в выводе, но меняет precision. Примеры Timestamp TZ: Hook COPY также переводит значения timestamp из часового пояса сеанса в UTC, благодаря чему они выводятся относительно этого часового пояса. При загрузке в новую систему та должна преобразовать их в свой локальный часовой пояс. Таким образом, сами значения будут различаться при разных часовых поясах, но будут совпадать с точностью до разницы часовых поясов. Пример влияния настройки timezone на временную метку 2026-08-28T12:00:00:

chDB в Postgres

chdb_hook сопоставляет типы ClickHouse, возвращаемые DESCRIBE, со следующими типами Postgres: Любой тип chDB, отсутствующий в этой таблице, приводит к ошибке — в том числе Nested, Variant и Dynamic. Чтобы читать их как текст, используйте structure, сопоставляющую их с String. Для некоторых из этих типов Postgres поддерживает более узкий диапазон, чем chDB, поэтому копирование завершается ошибкой для Time или Time64 свыше 24 часов, а также для Date32 за пределами диапазона дат Postgres.

Кодирование текста

chDB читает String, FixedString, Enum и JSON как байты, без каких-либо гарантий кодирования. При копировании такого столбца в text или в любой другой небинарный тип байты проверяются на соответствие кодированию базы данных, и для данных, которые невозможно представить, вызывается ошибка:
Любое кодирование отвергает NUL-символы, которые Postgres не может хранить в text. Копируйте в bytea, чтобы сохранить байты в том виде, в котором их записал chDB. Задавайте таким полям соответствующие имена, поскольку CREATE TABLE выводит для этих типов text:
FixedString(N) дополняет более короткие значения байтами NUL. При копировании в text завершающие NUL отбрасываются, тогда как bytea сохраняет все N байт.

Настройки

chdb_hook.max_memory

Определяет максимальный объём памяти для запроса chDB; используется для установки настройки chDB max_memory_usage. Требует привилегий суперпользователя. Укажите целое число, задающее количество мегабайт, либо значение с одной из следующих единиц измерения памяти:
  • B (байты)
  • kB (килобайты)
  • MB (мегабайты)
  • GB (гигабайты)
  • TB (терабайты)
Значение по умолчанию — 0: память не ограничивается.

chdb_hook.max_threads

Максимальное количество потоков обработки запросов для запроса chDB; используется для установки настройки chDB max_threads. Требует привилегий суперпользователя. Значение по умолчанию — 0: в этом случае chDB определяет значение самостоятельно. Мы настоятельно рекомендуем задавать chdb_hook.max_threads перед выполнением крупной операции COPY, чтобы chDB не загружал CPU полностью в ущерб PostgreSQL.

chdb_hook.max_parsing_threads

Максимальное число потоков, которые chDB может использовать для разбора данных во входных форматах, поддерживающих параллельный разбор; используется для установки настройки chDB max_parsing_threads. Требует привилегий суперпользователя. Значение по умолчанию — 0: в этом случае chDB определяет значение самостоятельно. Рекомендуем задавать chdb_hook.max_parsing_threads перед выполнением COPY для больших объёмов данных, чтобы chDB не загружал CPU до предела в ущерб PostgreSQL.

Политика версионирования

chdb_hook придерживается Semantic Versioning для своих публичных релизов.
  • Мажорная версия увеличивается при изменениях API
  • Минорная версия увеличивается при обратно совместимых изменениях SQL
  • Патч-версия увеличивается при изменениях, затрагивающих только бинарный файл
После установки версию можно узнать с помощью функции pg_get_loaded_modules() в Postgres 18.

Авторы

Copyright (c) 2026, ClickHouse
Последнее изменение 26 сентября 2026 г.