Краткое описание
Описание
Модуль 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], чтобы расширение всегда
было доступно во всех сеансах и базах данных:
Перегрузка 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 URIGCS
URL для GCS имеют форму публичного 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.**: рекурсивно соответствует всем файлам в каталоге.
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_1.csv
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_2.csv
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_3.csv
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_1.csv
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_2.csv
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_3.csv
{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(по умолчанию)nonegzipилиgzbrotliилиbrxzилиLZMAzstdилиzstlz4bz2snappy
timeout
Тайм-аут запроса в миллисекундах. Применяется к URL-адресам HTTP, S3, GCS и Azure.
Значение по умолчанию — 30000 (30 с).
Отладка
При ошибке командаCOPY из chdb_hook добавляет в контекст ошибки
запрос chDB, который она пыталась выполнить:
{name:Type} для параметров запроса,
чтобы защититься от SQL-инъекций и снизить риск
попадания в журнал конфиденциальных данных, например учётных данных.
Если же вам нужно посмотреть содержимое этих параметров для отладки
проблемы, временно задайте для GUC Postgres [log_min_messages] значение DEBUG1 или
выше — тогда chdb_hook будет отправлять запрос и параметры в журнал Postgres
(но никогда не клиенту), где они будут выглядеть так:
Перегрузка CREATE TABLE
chdb_hook также встраивается в CREATE TABLE, благодаря чему таблица может получать свои столбцы и загружать строки из URL. Чтобы создать таблицу со структурой, полученной из URL, передайте URL в параметреstructure_from и оставьте список столбцов пустым:
copy_from, чтобы загрузить не только столбцы, но и строки:
copy_from определяет столбцы автоматически только в том случае, если сам оператор не задаёт ни одного столбца. Список столбцов, clause INHERITS, тип в OF или партиция — каждый из них задаёт столбцы, поэтому в таком случае copy_from копирует только:
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-массива, поэтому вместо
NULLCOPY 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читает поле ProtobufNullable, содержащее пустую строку или ноль, как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 и др.) hookCOPY выводит значения 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 или в любой другой
небинарный тип байты проверяются на соответствие кодированию базы данных, и для
данных, которые невозможно представить, вызывается ошибка:
text.
Копируйте в bytea, чтобы сохранить байты в том виде, в котором их записал chDB. Задавайте таким полям соответствующие имена, поскольку CREATE TABLE выводит для этих типов text:
FixedString(N) дополняет более короткие значения байтами NUL. При копировании в text завершающие NUL отбрасываются, тогда как bytea сохраняет все N байт.
Настройки
chdb_hook.max_memory
max_memory_usage. Требует привилегий суперпользователя. Укажите целое число, задающее
количество мегабайт, либо значение с одной из следующих единиц измерения памяти:
B(байты)kB(килобайты)MB(мегабайты)GB(гигабайты)TB(терабайты)
0: память не ограничивается.
chdb_hook.max_threads
max_threads. Требует привилегий суперпользователя. Значение по умолчанию — 0: в этом случае chDB определяет значение самостоятельно.
Мы настоятельно рекомендуем задавать chdb_hook.max_threads перед выполнением крупной операции COPY, чтобы chDB не загружал CPU полностью в ущерб PostgreSQL.
chdb_hook.max_parsing_threads
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.