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:
GCSA URL do GCS segue 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 alguns parâmetros extras são compatíveis:
Valor retornado
Uma tabela com a estrutura especificada para leitura ou gravação de dados no arquivo especificado.Exemplos
Selecionando as 5 primeiras linhas da tabela a partir do arquivo S3https://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
Suponha que temos vários arquivos com os seguintes URIs no S3:- ‘https://datasets-documentation.s3.eu-west-3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_1.csv'
- ‘https://datasets-documentation.s3.eu-west-3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_2.csv'
- ‘https://datasets-documentation.s3.eu-west-3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_3.csv'
- ‘https://datasets-documentation.s3.eu-west-3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_4.csv'
- ‘https://datasets-documentation.s3.eu-west-3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_1.csv'
- ‘https://datasets-documentation.s3.eu-west-3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_2.csv'
- ‘https://datasets-documentation.s3.eu-west-3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_3.csv'
- ‘https://datasets-documentation.s3.eu-west-3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_4.csv'
file-1.csv, …, file-4.csv:
test-data.csv.gz:
test-data.csv.gz a partir de uma tabela existente:
** pode ser usado para percorrer diretórios recursivamente. A consulta a seguir lê todos os arquivos chamados some_file_1.csv em my-test-bucket-768:
** para corresponder a vários nomes de arquivos recursivamente:
s3://:
config.xml:
Gravação particionada
Estratégia de particionamento
Compatível apenas com consultasINSERT.
wildcard: substitui o curinga {_partition_id} no caminho do arquivo pela chave de partição correspondente. É selecionada por padrão quando o caminho contém {_partition_id}.
Quando nenhum partition_strategy é definido, um caminho com outro glob não usa estratégia de particionamento e ignora PARTITION BY. Um caminho sem glob usa hive quando file_like_engine_default_partition_strategy é hive; caso contrário, não usa estratégia de particionamento.
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
O ClickHouse tenta buscar credenciais de vários tipos diferentes de fontes. Às vezes, isso pode causar problemas ao acessar alguns buckets públicos, fazendo com que o cliente retorne o código de erro403.
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)
Para buckets não públicos, é possível informaraws_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:
external_id opcional também pode ser informado junto com role_arn. Ele é passado como o parâmetro ExternalId na chamada AssumeRole do AWS STS e permite que a política de confiança da role exija um segredo compartilhado, o que mitiga o problema do confused deputy. Por exemplo:
Trabalhando com arquivos compactados
Suponha que temos vários arquivos compactados com os seguintes URIs no S3:- ‘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
Observe que as linhas só podem ser inseridas em arquivos novos. Não há ciclos de merge nem operações de divisão de arquivos. Depois que um arquivo é gravado, inserções subsequentes falharão. Veja mais detalhes aqui.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
Esta é uma indicação para o ClickHouse interpretar arquivos particionados no estilo Hive durante a leitura. Isso não tem efeito na escrita. Para manter simetria entre leitura e escrita, use o argumentopartition_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
Para acessar um bucket requester-pays, é preciso enviar o headerx-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:
Resolução de URLs relativas
A configuração s3_base permite fornecer uma URL relativa à funçãos3. Quando s3_base está definido e o argumento da função não inclui um esquema, ele é resolvido em relação à URL base, de acordo com a RFC 3986, usando as mesmas regras da configuração url_base da função url. URLs absolutas são transmitidas sem alteração.
A configuração também se aplica ao mecanismo de tabela S3 e às funções de tabela que compartilham a configuração s3 (s3Cluster, gcs, oss). Para o mecanismo de tabela S3, a URL resolvida é materializada na definição da tabela armazenada, de modo que a tabela não depende do valor de s3_base após sua criação.
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.
- s3_base - URL base para resolver URLs relativas passadas à função
s3. Vazio (desativado) por padrão.
Esquemas Avro aninhados
Ao ler arquivos Avro que contêm registros aninhados com diferenças entre si (por exemplo, alguns arquivos têm um campo extra dentro de um objeto aninhado), o ClickHouse pode retornar um erro como: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.