s3 table function com INSERT INTO...SELECT, os dados são lidos e inseridos em streaming. Apenas alguns blocos de dados permanecem na memória enquanto os blocos são lidos continuamente do S3 e enviados para a tabela de destino.
Sintaxe
s3 aceita os seguintes parâmetros simples:
| Parâmetro | Descrição |
|---|---|
url | URL do bucket com o caminho para o arquivo. Aceita os seguintes caracteres curinga no modo somente leitura: *, **, ?, {abc,def} e {N..M}, em que N, M — números, 'abc', 'def' — strings. Para mais informações, veja aqui. |
NOSIGN | Se esta palavra-chave for fornecida no lugar das credenciais, nenhuma requisição será assinada. |
access_key_id and secret_access_key | Chaves que especificam as credenciais a serem usadas com o endpoint informado. Opcional. |
session_token | Token de sessão a ser usado com as chaves fornecidas. Opcional ao informar chaves. |
format | O formato do arquivo. |
structure | Estrutura da tabela. Formato: 'column1_name column1_type, column2_name column2_type, ...'. |
compression_method | O parâmetro é opcional. Valores aceitos: none, gzip ou gz, brotli ou br, xz ou LZMA, zstd ou zst. Por padrão, o método de compactação é detectado automaticamente pela extensão do arquivo. |
headers | O parâmetro é opcional. Permite passar cabeçalhos na requisição ao S3. Informe-os no formato headers(key=value), por exemplo headers('x-amz-request-payer' = 'requester'). |
partition_strategy | O parâmetro é opcional. Valores aceitos: WILDCARD ou HIVE. WILDCARD exige um {_partition_id} no caminho, que é substituído pela chave de partição. HIVE não permite caracteres curinga, presume que o caminho é a raiz da tabela e gera diretórios particionados no estilo Hive com IDs Snowflake como nomes de arquivo e o formato do arquivo como extensão. O padrão é WILDCARD |
partition_columns_in_data_file | O parâmetro é opcional. Usado apenas com a estratégia de particionamento HIVE. Informa ao ClickHouse se deve esperar que as colunas de partição sejam gravadas no arquivo de dados. O padrão é false. |
extra_credentials | O parâmetro é opcional. Usado para passar um role_arn para acesso baseado em função no ClickHouse Cloud. Consulte Secure S3 para ver as etapas de configuração. |
storage_class_name | O parâmetro é opcional. Valores aceitos: STANDARD ou INTELLIGENT_TIERING. Permite especificar o AWS S3 Intelligent Tiering. O padrão é STANDARD. |
GCSA URL do GCS tem este formato, pois o endpoint da API XML do Google é diferente do da API JSON:e não https://storage.cloud.google.com.
url, access_key_id, secret_access_key, format, structure, compression_method funcionam da mesma forma, e há suporte a alguns parâmetros extras:
| Argumento | Descrição |
|---|---|
filename | anexado à URL, se especificado. |
use_environment_credentials | habilitado por padrão; permite passar parâmetros extras usando as variáveis de ambiente AWS_CONTAINER_CREDENTIALS_RELATIVE_URI, AWS_CONTAINER_CREDENTIALS_FULL_URI, AWS_CONTAINER_AUTHORIZATION_TOKEN, AWS_EC2_METADATA_DISABLED. |
no_sign_request | desabilitado por padrão. |
expiration_window_seconds | o valor padrão é 120. |
Valor retornado
Exemplos
https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv:
O ClickHouse usa extensões de nome de arquivo para determinar o formato dos dados. Por exemplo, poderíamos ter executado o comando anterior sem O ClickHouse também consegue determinar o método de compressão do arquivo. Por exemplo, se o arquivo tivesse sido compactado com a extensão
CSVWithNames:.csv.gz, o ClickHouse o descompactaria automaticamente.Arquivos Parquet com nomes como
*.parquet.snappy ou *.parquet.zstd podem confundir o ClickHouse e causar erros TOO_LARGE_COMPRESSED_BLOCK ou ZSTD_DECODER_FAILED.
Isso acontece porque o ClickHouse tentaria ler o arquivo inteiro como dados codificados com Snappy ou ZSTD, quando na verdade o Parquet aplica compressão no nível de grupos de linhas e colunas.Os metadados do Parquet já especificam a compressão de cada coluna e, portanto, a extensão do arquivo é supérflua.
Nesses casos, você pode simplesmente 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 a partir de uma tabela existente:
my-test-bucket-768 de forma recursiva:
test-data.csv.gz em qualquer pasta dentro do diretório my-test-bucket, de forma recursiva:
's3://clickhouse-public-datasets/my-test-bucket-768/**/test-data.csv.gz' seria substituída por 'http://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/**/test-data.csv.gz'
É possível adicionar um mapeador personalizado no config.xml:
Gravação particionada
Estratégia de particionamento
INSERT.
WILDCARD (padrão): substitui o curinga {_partition_id} no caminho do arquivo pela chave de partição correspondente.
HIVE implementa o particionamento no estilo Hive para leituras & gravações. Gera arquivos usando o seguinte formato: <prefix>/<key1=val1/key2=val2...>/<snowflakeid>.<toLower(file_format)>.
Exemplo da estratégia de particionamento HIVE
WILDCARD
- Usar o ID da partição em uma chave gera arquivos separados:
file_x.csv, file_y.csv e file_z.csv.
- Ao usar o ID da partição no nome do bucket, os arquivos são criados em buckets diferentes:
my_bucket_1/file.csv, my_bucket_10/file.csv e my_bucket_20/file.csv.
Acessando buckets públicos
403.
Esse problema pode ser evitado usando a palavra-chave NOSIGN, forçando o cliente a ignorar todas as credenciais e a não assinar as requisições.
Usando credenciais do S3 (ClickHouse Cloud)
aws_access_key_id e aws_secret_access_key à função. Por exemplo:
roleARN pode ser passado para a função s3 por meio do parâmetro extra_credentials. Por exemplo:
Trabalhando com arquivos compactados
- ‘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 oferece suporte a três formatos de arquivo:
ZIP
TAR
7Z
Embora os arquivos ZIP e TAR possam ser acessados de qualquer local de armazenamento compatível, os arquivos 7Z só podem ser lidos no sistema de arquivos local onde o ClickHouse está instalado.
Inserindo dados
Colunas virtuais
_path— Caminho para o arquivo. Tipo:LowCardinality(String). Em caso de arquivo compactado, mostra o caminho no formato:"{path_to_archive}::{path_to_file_inside_archive}"_file— Nome do arquivo. Tipo:LowCardinality(String). Em caso de arquivo compactado, mostra o nome do arquivo dentro do arquivo compactado._size— Tamanho do arquivo em bytes. Tipo:Nullable(UInt64). Se o tamanho do arquivo for desconhecido, o valor seráNULL. Em caso de arquivo compactado, mostra o tamanho descompactado do arquivo dentro do arquivo compactado._time— Data e hora da última modificação do arquivo. Tipo:Nullable(DateTime). Se a data e hora forem desconhecidas, o valor seráNULL.
configuração use_hive_partitioning
partition_strategy.
Quando a configuração use_hive_partitioning é definida como 1, o ClickHouse detecta o particionamento no estilo Hive no caminho (/name=value/) e permite usar colunas de partição como colunas virtuais na consulta. Essas colunas virtuais terão os mesmos nomes do caminho particionado.
Exemplo
Acessando buckets requester-pays
x-amz-request-payer = requester em qualquer solicitação. Isso é feito passando o parâmetro headers('x-amz-request-payer' = 'requester') para a função s3. Por exemplo:
Configurações de armazenamento
- s3_truncate_on_insert - permite truncar o arquivo antes de inserir dados nele. Desativado por padrão.
- s3_create_new_file_on_insert - permite criar um novo arquivo a cada inserção se o formato tiver um sufixo. Desativado por padrão.
- s3_skip_empty_files - permite ignorar arquivos vazios durante a leitura. Ativado por padrão.
Esquemas Avro aninhados
The number of leaves in record doesn’t match the number of elements in tuple…Isso acontece porque o ClickHouse espera que todas as estruturas de registros aninhados sigam o mesmo esquema. Para lidar com esse cenário, você pode:
- Usar
schema_inference_mode='union'para mesclar diferentes esquemas de registros aninhados, ou - Alinhar manualmente suas estruturas aninhadas e habilitar
use_structure_from_insertion_table_in_table_functions=1.
Nota de desempenho
schema_inference_mode='union' pode levar mais tempo em conjuntos de dados do S3 muito grandes, porque precisa examinar cada arquivo para inferir o esquema.