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
s3 admite los siguientes parámetros simples:
| Parámetro | Descripción |
|---|---|
url | URL del bucket con la ruta al archivo. Admite los siguientes comodines en modo de solo lectura: *, **, ?, {abc,def} y {N..M}, donde N y M son números, y 'abc' y 'def' son cadenas. Para más información, consulta aquí. |
NOSIGN | Si esta palabra clave se proporciona en lugar de credenciales, ninguna de las solicitudes se firmará. |
access_key_id y secret_access_key | Claves que especifican las credenciales que se usarán con el endpoint indicado. Opcionales. |
session_token | Token de sesión que se usará con las claves indicadas. Opcional cuando se pasan claves. |
format | El formato del archivo. |
structure | Estructura de la tabla. Formato: 'column1_name column1_type, column2_name column2_type, ...'. |
compression_method | El parámetro es opcional. Valores admitidos: none, gzip o gz, brotli o br, xz o LZMA, zstd o zst. De forma predeterminada, el método de compresión se detecta automáticamente a partir de la extensión del archivo. |
headers | El parámetro es opcional. Permite pasar encabezados en la solicitud a S3. Deben pasarse en el formato headers(key=value), por ejemplo, headers('x-amz-request-payer' = 'requester'). |
partition_strategy | El parámetro es opcional. Valores admitidos: WILDCARD o HIVE. WILDCARD requiere {_partition_id} en la ruta, que se reemplaza por la clave de partición. HIVE no permite comodines, asume que la ruta es la raíz de la tabla y genera directorios particionados al estilo Hive con Snowflake IDs como nombres de archivo y el formato de archivo como extensión. El valor predeterminado es WILDCARD |
partition_columns_in_data_file | El parámetro es opcional. Solo se usa con la estrategia de partición HIVE. Indica a ClickHouse si debe esperar que las columnas de partición se escriban en el archivo de datos. El valor predeterminado es false. |
extra_credentials | El parámetro es opcional. Se usa para pasar un role_arn para acceso basado en roles en ClickHouse Cloud. Consulta Secure S3 para ver los pasos de configuración. |
storage_class_name | El parámetro es opcional. Valores admitidos: STANDARD o INTELLIGENT_TIERING. Permite especificar AWS S3 Intelligent Tiering. El valor predeterminado es STANDARD. |
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.
url, access_key_id, secret_access_key, format, structure y compression_method funcionan de la misma manera, y se admiten algunos parámetros adicionales:
| Argumento | Descripción |
|---|---|
filename | se añade a la URL si se especifica. |
use_environment_credentials | está habilitado de forma predeterminada y permite pasar parámetros adicionales mediante las variables de entorno AWS_CONTAINER_CREDENTIALS_RELATIVE_URI, AWS_CONTAINER_CREDENTIALS_FULL_URI, AWS_CONTAINER_AUTHORIZATION_TOKEN, AWS_EC2_METADATA_DISABLED. |
no_sign_request | está deshabilitado de forma predeterminada. |
expiration_window_seconds | el valor predeterminado es 120. |
Valor devuelto
Ejemplos
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 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
CSVWithNames:.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
- ‘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/some_prefix/some_file_4.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'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_4.csv'
file-000.csv, file-001.csv, … , file-999.csv:
test-data.csv.gz:
test-data.csv.gz desde una tabla existente:
my-test-bucket-768 de forma recursiva:
test-data.csv.gz de cualquier carpeta dentro del directorio my-test-bucket de forma recursiva:
'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:
Escritura particionada
Estrategia de partición
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
WILDCARD
- Incluir el ID de la partición en una clave crea archivos separados:
file_x.csv, file_y.csv y file_z.csv.
- Incluir el ID de la partición en el nombre de un bucket crea archivos en diferentes buckets:
my_bucket_1/file.csv, my_bucket_10/file.csv y my_bucket_20/file.csv.
Acceso a buckets públicos
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)
aws_access_key_id y aws_secret_access_key a la función. Por ejemplo:
roleARN a la función s3 mediante el parámetro extra_credentials. Por ejemplo:
Trabajo con archivos comprimidos
- ‘https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-10.csv.zip'
- ‘https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-11.csv.zip'
- ‘https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-12.csv.zip'
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
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 esNULL. 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 esNULL.
configuración use_hive_partitioning
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
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
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 rendimiento
schema_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.