Sinopsis
Descripción
El módulo chdb_hook se engancha al comando COPY de PostgreSQL para usar chDB y copiar datosTO o FROM cualquiera de los
formatos de datos compatibles que ofrece chDB, ya sea en archivos
locales, buckets de AWS S3, Google Cloud Storage y más. También se engancha
a CREATE TABLE, de modo que una tabla puede derivar sus columnas y cargar
sus filas desde cualquiera de esos mismos destinos.
Carga
Cargue chdb_hook de una de las siguientes maneras como super user. Utilice la que resulte más adecuada para su caso de uso:-
Explícitamente mediante el comando LOAD; se mantiene durante toda la session:
La SQL Console de ClickHouse Cloud aún no admite el comando
LOAD 'chdb_hook', pero puede ejecutarse mediante psql o cualquier otra conexión a la base de datos. De lo contrario, póngase en contacto con su representante de soporte para añadirlo a la configuración de su service de Postgres, tras lo cual podrá utilizarse en la SQL Console. -
Para todas las sessions, mediante el setting [session_preload_libraries], en
postgresql.conf:O mediante ALTER SYSTEM:Este setting también puede establecerse por base de datos mediante ALTER DATABASE:O para usuarios y grupos específicos mediante ALTER ROLE: -
Al iniciar el servidor, mediante el setting [shared_preload_libraries], de modo que
esté siempre disponible para todas las sessions y bases de datos:
Sobrecarga de COPY
Durante la carga, chdb_hook se engancha al comando COPY de Postgres para copiar datosTO o FROM cualquiera de los formatos de datos compatibles que proporciona
chDB en archivos locales, buckets de AWS S3, Google Cloud Storage y
más. Por ejemplo, para cargar una tabla desde un archivo CSV en S3, cree la tabla
y luego llame a COPY con una URL s3://:
Privilegios
UnCOPY de chdb_hook requiere los mismos privilegios que el COPY al que reemplaza:
SELECT sobre la relación o sobre cada columna copiada en el caso de COPY TO, e INSERT
en el de COPY FROM. Una URL file:// lee o escribe un archivo en el servidor, por lo que
también exige pertenecer a pg_read_server_files o pg_write_server_files.
COPY FROM requiere una transacción de lectura-escritura.
Esquemas de URL
chdb_hook solo se ejecuta para destinosCOPY de tipo URL que utilicen uno de los
siguientes esquemas:
Formatos de URL
El formato de las URL varía según el destino.File
Debe ser una ruta absoluta en el servidor de Postgres. Una ruta relativa provoca un error. El usuario de Postgres debe ser miembro del rolpg_read_server_files o
pg_write_server_files, según corresponda. El usuario del sistema de Postgres debe
tener acceso de lectura o escritura al archivo, según corresponda. En el caso de COPY TO, si la
ruta no existe, chdb_hook creará los directorios padre que falten; para ello debe
contar con los permisos necesarios en el sistema de archivos. Ejemplo:
HTTP
Cualquier URL HTTP normal, incluidas las de almacenamiento en la nube público. ParaCOPY TO,
chdb_hook intentará enviar los datos a la URL mediante POST. Ejemplo:
S3
Las URL de S3 pueden tener la forma de un URI de S3GCS
Las URL de GCS tienen el formato de una URL pública:Azure Blob Storage
Utilice una URLblob.windows.net con el nombre de la cuenta como subdominio:
Azure ABFS
Las URL de ABFS deben usar este formato:URL de HDFS
Las URL de HDFS pueden usar URL con el estilo típico de HTTP y un puerto opcional:Comodines de ruta
Las rutas URL pueden contener globs en los comandosCOPY FROM. Los archivos deben coincidir con
el patrón de ruta completo, no solo con el sufijo o el prefijo. La única excepción: cuando
la ruta hace referencia a un directorio existente y no usa globs, se añadirá implícitamente un *
a la ruta para seleccionar todos los archivos del directorio.
Comodines admitidos:
*: Coincide con cualquier cantidad de caracteres excepto/, incluida la cadena vacía.?: Coincide con un único carácter arbitrario.{groucho,harpo,chico}: Sustituye cualquiera de las cadenas “groucho”, “harpo” y “chico”. Las cadenas pueden contener/.{N..M}: Coincide con cualquier número>= Ny<= M.**: Coincide recursivamente con todos los archivos de un directorio.
- 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 para hacer coincidir los dos nombres de directorio y
some_file_{1..3}.csv' para los archivos, de este modo:
Opciones
El comandoCOPY de chdb_hook admite las siguientes opciones:
format:
El formato de lectura o escritura. Debe ser uno de los formats que ofrece chDB,
entre los que se incluyen TSV, CSV, Parquet, Iceberg, JSON y otros. Omítalo o establézcalo en
auto para que chDB determine el formato a partir de la extensión del nombre del archivo al final
de la URL.
structure
La estructura de datos de chDB para una fila. Consta de una lista de nombres de columnas,
[tipos de datos de ClickHouse] y modificadores. Si se omite, chdb_hook asigna los tipos de
datos de Postgres a tipos de ClickHouse generalmente apropiados; consulte Postgres a
chDB para más detalles. Si se establece en auto, chDB intenta inferir
los tipos.
Ejemplo:
access_key y access_secret
Credenciales de larga duración del usuario de la cuenta de AWS para autenticar las solicitudes.
- S3: Un [ID de clave de acceso y clave secreta de acceso] de AWS, definidos habitualmente mediante las variables de entorno
AWS_ACCESS_KEY_IDyAWS_SECRET_ACCESS_KEY - GCS: Una [clave HMAC y su secreto] de GCP
- Azure: Un nombre de cuenta de Azure Storage y su [clave de acceso]
session_token
Token de sesión de AWS que se usa junto con access_key y access_secret, definido
habitualmente por la variable de entorno AWS_SESSION_TOKEN. Se utiliza únicamente para
URL de S3.
compression
Formato de compresión del archivo. Úselo si la compresión no puede inferirse a partir del
nombre del archivo. Valores admitidos:
auto(predeterminado)nonegzipogzbrotliobrxzoLZMAzstdozstlz4bz2snappy
timeout
Tiempo de espera de la solicitud en milisegundos. Se aplica a las URL de HTTP, S3, GCS y Azure.
El valor predeterminado es 30000 (30 s).
Depuración
Cuando se produce un error, el comandoCOPY de chdb_hook incluye en el contexto del error la consulta de chDB que intentó
ejecutar:
{name:Type} para los parámetros de consulta
con el fin de protegerse frente a vulnerabilidades de injection de SQL y minimizar el riesgo de
registrar datos sensibles como credenciales.
No obstante, si necesitas ver el contenido de esos parámetros para depurar
un issue, configura temporalmente el GUC [log_min_messages] de Postgres con el valor DEBUG1 o
superior para que chdb_hook envíe la consulta y los parámetros al log de Postgres
(nunca al client), donde aparecerán así:
Sobrecarga de CREATE TABLE
chdb_hook también se engancha a CREATE TABLE, de modo que una tabla puede derivar sus columnas y cargar sus filas desde una URL. Para crear una tabla cuya estructura se derive de una URL, pase la URL en la opciónstructure_from y deje vacía la lista de columnas:
copy_from para cargar tanto las filas como las columnas:
copy_from infiere las columnas solo cuando el statement no declara ninguna propia.
Una lista de columnas, un clause INHERITS, un type OF o una partición definen
columnas, por lo que, en ese caso, copy_from solo copia:
COPY: se aplican las credenciales, el formato, la
compresión, el timeout e incluso una estructura explícita. Postgres
conserva los parámetros de almacenamiento restantes:
structure_from ni copy_from funcionan con IF NOT EXISTS. Utilice
COPY para cargar una relación existente.
Limitaciones
Debido a algunos problemas conocidos y a las variaciones en el comportamiento de los tipos de datos entre Postgres y chDB, chdb_hook presenta las siguientes limitaciones:- No se puede hacer
COPYde relaciones con políticas de row-level security que se apliquen al rol que realiza la copia. Postgres aplica dichas políticas reescribiendoCOPY TOcomo una consulta, algo que chdb_hook no admite. - ClickHouse no tiene un array NULL, por lo que
COPY TOalmacena un array vacío ([]) en lugar de unNULL. - ClickHouse representa los equivalentes de
lseg,pathopolygoncomo arrays; por lo tanto, los valores NULL de estos tipos también se escriben conCOPY TOcomo un array vacío ([]). - Los valores NULL emitidos para una structure especificada que no defina la columna como Nullable se emitirán como sus valores predeterminados. Defina siempre explícitamente las columnas nullable en la structure para evitar esta conversión.
- Un
pathabierto cuyo último punto coincide con el primero se emite como un path cerrado. - Protobuf no admite null en un campo repetido, por lo que omite los valores NULL en los arrays.
- El JSON type de chDB solo admite objetos JSON; sobrescriba la correspondencia predeterminada
StringdejsonyjsonbconJSONúnicamente si todos los valores son objetos JSON. (ClickHouse/ClickHouse#68428) - El JSON type de chDB ignora los
null; las claves de objeto con valores NULL se omitirán en la salida. Sobrescriba la correspondencia predeterminadaStringdejsonyjsonbconJSONúnicamente si los valores del objeto no sonnullo si su pérdida resulta aceptable. (ClickHouse/ClickHouse#68428) - Los formatos JSON, JSONCompact y JSONColumnsWithMetadata siempre validan UTF-8, por lo que emiten los valores bytea con caracteres de reemplazo.
COPY FROMlee comoNULLun campoNullablede Protobuf que contenga una cadena vacía o un cero. (chdb-io/chdb-core#152)COPY TOen Parquet descarta losNULLdel propio null map de un Tuple Nullable. (ClickHouse/ClickHouse#112427)- Los formatos Parquet, Arrow, ArrowStream, ORC, Avro, Protobuf, ProtobufList, MsgPack
y BSONEachRow no tienen un tipo equivalente al
timede Postgres ni alTime64de chDB. Configure las columnastimecomoStringen una structure explícita para preservar sus valores. - La salida de Protobuf trunca los valores de timestamp al segundo.
- La salida de Protobuf no admite fechas anteriores al 1970-01-01. Configure las columnas
timecomoStringen una structure explícita para preservar sus valores. (ClickHouse/ClickHouse#111860) - Los formatos CSVWithNames y CSVWithNamesAndTypes no pueden importar actualmente
valores box o circle
NULL. (ClickHouse/ClickHouse#115523)
Tipos de datos
COPY asigna los tipos de Postgres de una relación a tipos de chDB, mientras que CREATE TABLE asigna los tipos de chDB de una URL a tipos de Postgres.Postgres a chDB
Si no se especifica explícitamente la opción structure, chdb_hook asigna los tipos de Postgres a equivalentes razonables de chDB. Cuando no se ajusten a su caso de uso, indique structure para sobrescribir los tipos generados con los que necesite.
Los tipos array se asignan a
Arrays del tipo de elemento correspondiente. ClickHouse restringe
la nulabilidad por columna, mientras que Postgres lo hace por array, de modo que los elementos son
siempre Nullable.
Ningún tipo de Postgres se asigna a Map ni a Tuple, pero structure puede
indicar uno. Un Map puede convertirse en un array de pares clave-valor, y un Tuple
se convierte en un array. Use text[] para admitir datos heterogéneos.
Conversión de timestamp
En formatos de texto plano (TSV, CSV, etc.), el hookCOPY emite los valores DateTime y
DateTime64 en formato ISO-8601, YYYY-MM-DDThh:mm:ssZ, sin tener en cuenta
la configuración actual de datestyle. Esto garantiza que los valores timestamptz
se mantengan coherentes, incluso si un origen que importa los valores usa una zona
horaria distinta. Usar un tipo diferente en la salida de structure, como Datetime64(3, 'America/Los_Angeles'), no afecta al desplazamiento de la salida, pero sí
cambia la precision.
Ejemplos de timestamp TZ:
El hook
COPY también convierte los valores timestamp de la session zona horaria a
UTC, con lo que se garantiza que se emitan en relación con esa zona horaria. Al cargarlos
en un sistema nuevo, este debería convertirlos a su zona horaria local. Por tanto, los
valores diferirán si la zona horaria difiere, pero serán equivalentes respecto a
la diferencia de zona horaria.
Ejemplo del efecto de la configuración timezone sobre el timestamp
2026-08-28T12:00:00:
chDB a Postgres
chdb_hook asigna los tipos de ClickHouse devueltos porDESCRIBE a estos
tipos de Postgres:
Todo tipo de chDB omitido en esta tabla lanza un error, entre ellos
Nested,
Variant y Dynamic. Use una structure que los asigne a
String para leerlos como texto.
Postgres admite un rango más estrecho que chDB en algunos de estos tipos; por
ello, la copia lanza un error con un Time o Time64 que supere las 24 horas,
y con un Date32 fuera del rango de fechas de Postgres.
Codificación de texto
chDB leeString, FixedString, Enum y JSON como bytes, sin
ninguna garantía de codificación. Al copiar una columna de ese tipo a text, o a cualquier otro
tipo no binario, se verifican los bytes según la codificación de la base de datos y se lanza un error
para los datos que no se pueden representar:
text.
Copia en bytea para conservar los bytes tal como los escribió chDB. Nombra así estos casos, ya que
CREATE TABLE deriva text para estos tipos:
FixedString(N) rellena con bytes NUL los valores más cortos. Al copiarlos a text se descartan los NUL finales, mientras que bytea conserva los N bytes.
Configuración
chdb_hook.max_memory
max_memory_usage de chDB. Requiere privilegios de superuser. Utilice un número entero
para indicar la cantidad de megabytes o una de las siguientes unidades de memoria:
B(bytes)kB(kilobytes)MB(megabytes)GB(gigabytes)TB(terabytes)
0, que no impone ningún límite de memoria.
chdb_hook.max_threads
max_threads de chDB. Requiere privilegios de superusuario. Su valor predeterminado es 0, lo que permite que chDB determine el valor.
Recomendamos encarecidamente configurar chdb_hook.max_threads antes de ejecutar un COPY de gran tamaño, para evitar que chDB agote el uso de CPU en detrimento de PostgreSQL.
chdb_hook.max_parsing_threads
max_parsing_threads
de chDB. Requiere privilegios de superusuario. Su valor predeterminado es 0, lo que permite que chDB
determine el valor.
Recomendamos definir chdb_hook.max_parsing_threads antes de ejecutar un COPY con grandes volúmenes de
datos, para evitar que chDB acapare el uso de CPU en detrimento de
PostgreSQL.
Política de control de versiones
chdb_hook sigue el control de versiones semántico en sus releases públicas.- La versión mayor se incrementa ante cambios en la API
- La versión menor se incrementa ante cambios de SQL retrocompatibles
- La versión de patch se incrementa ante cambios que solo afectan al binary
pg_get_loaded_modules() de Postgres 18.