Saltar al contenido principal
Proporciona una interfaz de tipo tabla para seleccionar/insertar archivos en Amazon S3 y Google Cloud Storage. Esta función de tabla es similar a la función hdfs, pero ofrece características específicas de S3. Si tiene varias réplicas en su clúster, puede usar en su lugar la función s3Cluster para paralelizar las inserciones. Al usar la función de tabla S3 con INSERT INTO...SELECT, los datos se leen y se insertan en streaming. Solo unos pocos bloques de datos permanecen en memoria mientras los bloques se leen continuamente desde S3 y se envían a la tabla de destino.

Sintaxis

GCSLa función de tabla S3 se integra con Google Cloud Storage mediante la API XML de GCS y claves HMAC. Consulta la documentación de interoperabilidad de Google para obtener más información sobre el endpoint y HMAC.Para GCS, sustituye tu clave HMAC y tu secreto HMAC donde aparezcan access_key_id y secret_access_key.
Parámetros La función de tabla s3 admite los siguientes parámetros simples:
GCSLa URL de GCS tiene este formato, ya que el endpoint de la API XML de Google es diferente del de la API JSON:
y no https://storage.cloud.google.com.
Los argumentos también pueden pasarse mediante named collections. En este caso, url, access_key_id, secret_access_key, format, structure y compression_method funcionan de la misma manera, y se admiten algunos parámetros adicionales:

Valor devuelto

Una tabla con la estructura especificada para leer o escribir datos en el archivo indicado.

Ejemplos

Seleccionar las primeras 5 filas de la tabla del archivo S3 https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv:
ClickHouse usa las extensiones de archivo para determinar el formato de los datos. Por ejemplo, podríamos haber ejecutado el comando anterior sin CSVWithNames:
ClickHouse también puede determinar el método de compresión del archivo. Por ejemplo, si el archivo estuviera comprimido y tuviera la extensión .csv.gz, ClickHouse lo descomprimiría automáticamente.
Los archivos Parquet con nombres como *.parquet.snappy o *.parquet.zstd pueden confundir a ClickHouse y provocar errores TOO_LARGE_COMPRESSED_BLOCK o ZSTD_DECODER_FAILED. Esto se debe a que ClickHouse intentaría leer el archivo completo como datos codificados con Snappy o ZSTD cuando, en realidad, Parquet aplica compresión a nivel de grupo de filas y de columna.Los metadatos de Parquet ya especifican la compresión de cada columna, por lo que la extensión del archivo es superflua. En estos casos, basta con usar compression_method = 'none':

Uso

Supongamos que tenemos varios archivos con los siguientes URIs en S3: Cuenta el número de filas en archivos cuyos nombres terminan con números del 1 al 3:
Cuenta el número total de filas en todos los archivos de estos dos directorios:
Si la lista de archivos contiene rangos numéricos con ceros a la izquierda, use la sintaxis con llaves para cada dígito por separado o ?.
Cuenta el número total de filas en los archivos con nombre file-000.csv, file-001.csv, … , file-999.csv:
Inserte datos en el archivo test-data.csv.gz:
Inserte datos en el archivo test-data.csv.gz desde una tabla existente:
El glob ** puede utilizarse para el recorrido recursivo de directorios. Considere el siguiente ejemplo: recuperará todos los archivos del directorio my-test-bucket-768 de forma recursiva:
Lo siguiente obtiene datos de todos los archivos test-data.csv.gz de cualquier carpeta dentro del directorio my-test-bucket de forma recursiva:
Nota. Es posible especificar mapeadores de URL personalizados en el archivo de configuración del servidor. Ejemplo:
La URL 's3://clickhouse-public-datasets/my-test-bucket-768/**/test-data.csv.gz' se reemplazaría por 'http://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/**/test-data.csv.gz' Se puede añadir un mapeador personalizado en config.xml:
Para casos de uso en producción, se recomienda usar named collections. Aquí tienes un ejemplo:

Escritura particionada

Estrategia de partición

Compatible solo con consultas INSERT. WILDCARD (predeterminado): Reemplaza el comodín {_partition_id} en la ruta del archivo por la clave de partición correspondiente. HIVE implementa el particionado al estilo Hive para lecturas y escrituras. Genera archivos con el siguiente formato: <prefix>/<key1=val1/key2=val2...>/<snowflakeid>.<toLower(file_format)>. Ejemplo de estrategia de partición HIVE
Ejemplos de la estrategia de partición WILDCARD
  1. Incluir el ID de la partición en una clave crea archivos separados:
Como resultado, los datos se escriben en tres archivos: file_x.csv, file_y.csv y file_z.csv.
  1. Incluir el ID de la partición en el nombre de un bucket crea archivos en diferentes buckets:
Como resultado, los datos se escriben en tres archivos en distintos buckets: my_bucket_1/file.csv, my_bucket_10/file.csv y my_bucket_20/file.csv.

Acceso a buckets públicos

ClickHouse intenta obtener credenciales de muchos tipos de fuentes. A veces, esto puede causar problemas al acceder a algunos buckets públicos, lo que hace que el cliente devuelva el código de error 403. Este problema puede evitarse usando la palabra clave NOSIGN, que obliga al cliente a ignorar todas las credenciales y a no firmar las solicitudes.

Uso de credenciales de S3 (ClickHouse Cloud)

Para los buckets que no son públicos, los usuarios pueden proporcionar aws_access_key_id y aws_secret_access_key a la función. Por ejemplo:
Esto es apropiado para accesos puntuales o en casos en los que las credenciales puedan rotarse fácilmente. Sin embargo, no se recomienda como solución a largo plazo para accesos repetidos o si las credenciales son sensibles. En este caso, recomendamos que los usuarios se basen en el acceso basado en roles. El acceso basado en roles para S3 en ClickHouse Cloud está documentado aquí. Una vez configurado, puede pasarse un roleARN a la función s3 mediante el parámetro extra_credentials. Por ejemplo:
Puede encontrar más ejemplos aquí

Trabajo con archivos comprimidos

Supongamos que tenemos varios archivos comprimidos con las siguientes URI en S3: Es posible extraer datos de estos archivos comprimidos usando ::. Se pueden usar patrones glob tanto en la parte de la URL como en la parte posterior a :: (que corresponde al nombre de un archivo dentro del archivo comprimido).
ClickHouse admite tres formatos de archivo: ZIP TAR 7Z Aunque se puede acceder a los archivos ZIP y TAR desde cualquier ubicación de almacenamiento compatible, los archivos 7Z solo pueden leerse desde el sistema de archivos local donde está instalado ClickHouse.

Inserción de datos

Tenga en cuenta que las filas solo se pueden insertar en archivos nuevos. No hay procesos de fusión ni operaciones de división de archivos. Una vez escrito un archivo, las inserciones posteriores fallarán. Consulte más detalles aquí.

Columnas virtuales

  • _path — Ruta al archivo. Tipo: LowCardinality(String). En caso de archivo comprimido, muestra la ruta con el formato: "{path_to_archive}::{path_to_file_inside_archive}"
  • _file — Nombre del archivo. Tipo: LowCardinality(String). En caso de archivo comprimido, muestra el nombre del archivo dentro del archivo comprimido.
  • _size — Tamaño del archivo en bytes. Tipo: Nullable(UInt64). Si se desconoce el tamaño del archivo, el valor es NULL. En caso de archivo comprimido, muestra el tamaño sin comprimir del archivo dentro del archivo comprimido.
  • _time — Hora de la última modificación del archivo. Tipo: Nullable(DateTime). Si se desconoce la hora, el valor es NULL.

configuración use_hive_partitioning

Esta es una indicación para que ClickHouse interprete archivos particionados con estilo Hive durante la lectura. No tiene efecto en la escritura. Para que las lecturas y escrituras sean simétricas, use el argumento partition_strategy. Cuando la configuración use_hive_partitioning se establece en 1, ClickHouse detectará el particionamiento de estilo Hive en la ruta (/name=value/) y permitirá usar las columnas de partición como columnas virtuales en la consulta. Estas columnas virtuales tendrán los mismos nombres que en la ruta particionada. Ejemplo

Acceso a buckets con pago por solicitante

Para acceder a un bucket con pago por solicitante, se debe enviar el encabezado x-amz-request-payer = requester en cualquier solicitud. Esto se logra pasando el parámetro headers('x-amz-request-payer' = 'requester') a la función s3. Por ejemplo:

Configuración de almacenamiento

  • s3_truncate_on_insert - permite truncar el archivo antes de insertar datos en él. Está deshabilitado de forma predeterminada.
  • s3_create_new_file_on_insert - permite crear un archivo nuevo en cada inserción si el formato tiene un sufijo. Está deshabilitado de forma predeterminada.
  • s3_skip_empty_files - permite omitir archivos vacíos durante la lectura. Está habilitado de forma predeterminada.

Esquemas Avro anidados

Al leer archivos Avro que contienen registros anidados cuya estructura varía entre archivos (por ejemplo, algunos archivos tienen un campo adicional dentro de un objeto anidado), ClickHouse puede devolver un error como este:
The number of leaves in record doesn’t match the number of elements in tuple…
Esto ocurre porque ClickHouse espera que todas las estructuras de registros anidados se ajusten al mismo esquema. Para manejar este caso, puede:
  • Usar schema_inference_mode='union' para fusionar distintos esquemas de registros anidados, o
  • Alinear manualmente sus estructuras anidadas y habilitar use_structure_from_insertion_table_in_table_functions=1.
Nota de rendimientoschema_inference_mode='union' puede tardar más en conjuntos de datos de S3 muy grandes, ya que debe examinar cada archivo para inferir el esquema.
Ejemplo
Última modificación el 19 de junio de 2026