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 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:
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: substitui o curinga {_partition_id} no caminho do arquivo pela chave de partição correspondente. É selecionada por padrão apenas em configurações de compatibility anteriores à 26.6; caso contrário, o padrão é hive (consulte a configuração file_like_engine_default_partition_strategy).
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:
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
- ‘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.