Uso
structure, com a estrutura dos dados de entrada. Se esse argumento não for especificado ou estiver definido como auto, a estrutura será inferida a partir dos dados.
Exemplo:
Suponha que haja um arquivo hobbies.jsonl no formato JSONEachRow no diretório user_files com o seguinte conteúdo:
JSONEachRow foi identificado automaticamente com base na extensão de arquivo .jsonl.
Você pode ver a estrutura identificada automaticamente usando a consulta DESCRIBE:
CREATE TABLE, a estrutura da tabela será inferida automaticamente com base nos dados.
Exemplo:
Vamos usar o arquivo hobbies.jsonl. Podemos criar uma tabela com o motor File usando os dados desse arquivo:
clickhouse-local
clickhouse-local tem um parâmetro opcional -S/--structure para a estrutura dos dados de entrada. Se esse parâmetro não for especificado ou for definido como auto, a estrutura será inferida a partir dos dados.
Exemplo:
Vamos usar o arquivo hobbies.jsonl. Podemos consultar os dados desse arquivo usando clickhouse-local:
Usando a estrutura da tabela de inserção
file/s3/url/hdfs são usadas para inserir dados em uma tabela,
há a opção de usar a estrutura da tabela de inserção em vez de extraí-la dos dados.
Isso pode melhorar o desempenho da inserção, porque a inferência de esquema pode levar algum tempo. Além disso, isso é útil quando a tabela tem um esquema otimizado, de modo que
nenhuma conversão entre tipos será realizada.
Há uma configuração especial use_structure_from_insertion_table_in_table_functions
que controla esse comportamento. Ela tem 3 valores possíveis:
- 0 - a função de tabela extrairá a estrutura dos dados.
- 1 - a função de tabela usará a estrutura da tabela de inserção.
- 2 - o ClickHouse determinará automaticamente se é possível usar a estrutura da tabela de inserção ou recorrer à inferência de esquema. Valor padrão.
hobbies1 com a seguinte estrutura:
hobbies.jsonl:
hobbies2 com a seguinte estrutura:
hobbies.jsonl:
SELECT estão presentes na tabela, então o ClickHouse usará a estrutura da tabela de inserção.
Observe que isso só funciona para formatos de entrada que oferecem suporte à leitura de um subconjunto de colunas, como JSONEachRow, TSKV, Parquet etc. (ou seja, não funciona, por exemplo, com o formato TSV).
Exemplo 3:
Vamos criar a tabela hobbies3 com a seguinte estrutura:
hobbies.jsonl:
id é usada na consulta SELECT, mas a tabela n’o tem essa coluna (ela tem uma coluna chamada identifier),
portanto, o ClickHouse n’o pode usar a estrutura da tabela de inserção, e será usada a inferência de esquema.
Exemplo 4:
Vamos criar a tabela hobbies4 com a seguinte estrutura:
hobbies.jsonl:
hobbies na consulta SELECT para inseri-la na tabela; por isso, o ClickHouse não pode usar a estrutura da tabela de inserção, e será usada a inferência de esquema.
Cache de inferência de esquema
schema_inference_cache_max_elements_for_{file/s3/hdfs/url/azure}- o número máximo de esquemas em cache para a função de tabela correspondente. O valor padrão é4096. Essas configurações devem ser definidas na configuração do servidor.schema_inference_use_cache_for_{file,s3,hdfs,url,azure}- permite ativar ou desativar o uso de cache para inferência de esquema. Essas configurações podem ser usadas em consultas.
url podem não conter informações sobre o horário da última modificação; nesse caso, existe uma configuração especial
schema_inference_cache_require_modification_time_for_url. Desativar essa configuração permite usar o esquema em cache sem o horário da última modificação para esses arquivos.
Também há uma system table schema_inference_cache com todos os esquemas atualmente em cache e a consulta de sistema SYSTEM CLEAR SCHEMA CACHE [FOR File/S3/URL/HDFS]
que permite limpar o cache de esquema de todas as origens ou de uma origem específica.
Exemplos:
Vamos tentar inferir a estrutura de um conjunto de dados de exemplo do S3 github-2022.ndjson.gz e ver como o cache de inferência de esquema funciona:
system.schema_inference_cache:
Formatos de texto
input_format_max_rows_to_read_for_schema_inference (25000 por padrão) e input_format_max_bytes_to_read_for_schema_inference (32Mb por padrão).
Por padrão, todos os tipos inferidos são Nullable, mas você pode alterar isso definindo schema_inference_make_columns_nullable (veja exemplos na seção configurações).
Formatos JSON
null, o ClickHouse usará os tipos dos demais elementos do array:
input_format_json_infer_array_of_dynamic_from_array_of_different_types estiver habilitada (habilitada por padrão), ele terá o tipo Array(Dynamic):
input_format_json_try_infer_named_tuples_from_objects estiver habilitada, durante a inferência de esquema o ClickHouse tentará inferir uma Tuple nomeada com base em objetos JSON.
A Tuple nomeada resultante conterá todos os elementos de todos os objetos JSON correspondentes nos dados de amostra.
input_format_json_infer_array_of_dynamic_from_array_of_different_types estiver desativada, tratamos Arrays com elementos de tipos distintos como Tuples sem nome em formatos JSON.
null ou estiverem vazios, usamos os tipos dos valores correspondentes nas outras linhas:
input_format_json_read_objects_as_strings e input_format_json_try_infer_named_tuples_from_objects estão desabilitadas.
String será usado se a configuração input_format_json_infer_incomplete_types_as_strings estiver habilitada; caso contrário, será gerada uma exceção:
Configurações do JSON
input_format_json_try_infer_numbers_from_strings
input_format_json_try_infer_named_tuples_from_objects
Query
Response
Query
Response
input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects
input_format_json_try_infer_named_tuples_from_objects está habilitado), em vez de gerar uma exceção.
Isso permite ler objetos JSON como Tuples nomeadas mesmo quando há caminhos ambíguos.
Desabilitada por padrão.
Exemplos
Com a configuração desabilitada:
Query
Response
Query
Response
input_format_json_read_objects_as_strings
input_format_json_try_infer_named_tuples_from_objects estiver desabilitada.
input_format_json_read_numbers_as_strings
input_format_json_read_bools_as_numbers
input_format_json_read_bools_as_strings
input_format_json_read_arrays_as_strings
input_format_json_infer_incomplete_types_as_strings
Null/{}/[] na amostra de dados durante a inferência de esquema.
Nos formatos JSON, qualquer valor pode ser lido como String se todas as configurações correspondentes estiverem habilitadas (todas elas ficam habilitadas por padrão), e podemos evitar erros como Cannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Maps durante a inferência de esquema
usando o tipo String para chaves com tipos desconhecidos.
Exemplo:
Query
Response
CSV
input_format_csv_use_best_effort_in_schema_inference
e o ClickHouse tratará todas as colunas como Strings.
Se a configuração input_format_csv_detect_header estiver habilitada, o ClickHouse tentará detectar o cabeçalho com nomes de colunas (e talvez tipos) ao inferir o esquema. Essa configuração vem habilitada por padrão.
Exemplos:
Inteiros, Floats, Bools, Strings:
input_format_csv_use_best_effort_in_schema_inference desativada:
input_format_csv_detect_header está ativado):
Apenas nomes:
String. Se todas as colunas forem do tipo String, o cabeçalho não será detectado:
Configurações do CSV
input_format_csv_try_infer_numbers_from_strings
TSV/TSKV
input_format_tsv_use_best_effort_in_schema_inference
e o ClickHouse tratará todas as colunas como Strings.
Se a configuração input_format_tsv_detect_header estiver habilitada, o ClickHouse tentará detectar o cabeçalho com nomes de colunas (e talvez tipos) ao inferir o esquema. Essa configuração vem habilitada por padrão.
Exemplos:
Inteiros, Floats, Bool, Strings:
input_format_tsv_use_best_effort_in_schema_inference desativada:
input_format_tsv_detect_header está ativado):
Somente nomes:
Valores
input_format_tsv_use_best_effort_in_schema_inference desativada:
CustomSeparated
input_format_custom_detect_header estiver habilitada, o ClickHouse tentará detectar o cabeçalho com nomes de colunas (e talvez tipos) ao inferir o esquema. Essa configuração é habilitada por padrão.
Exemplo
input_format_custom_detect_header está ativado):
Template
resultset com o seguinte conteúdo:
row_format com o conteúdo a seguir:
Regexp
Configurações para formatos de texto
input_format_max_rows_to_read_for_schema_inference/input_format_max_bytes_to_read_for_schema_inference
25000parainput_format_max_rows_to_read_for_schema_inference.33554432(32 Mb) parainput_format_max_bytes_to_read_for_schema_inference.
column_names_for_schema_inference
c1,c2,c3,.... Formato: column1,column2,column3,....
Exemplo
schema_inference_hints
schema_inference_make_columns_nullable $
Nullable na inferência de esquema para formatos sem informações sobre nulabilidade. Valores possíveis:
- 0 - o tipo inferido nunca será
Nullable, - 1 - todos os tipos inferidos serão
Nullable, - 2 ou ‘auto’ - para formatos de texto, o tipo inferido será
Nullablesomente se a coluna contiverNULLem uma amostra processada durante a inferência de esquema; para formatos fortemente tipados (Parquet, ORC, Arrow), as informações de nulidade são obtidas dos metadados do arquivo, - 3 - para formatos de texto, use
Nullable; para formatos com tipagem forte, use os metadados do arquivo.
input_format_try_infer_integers
Esta configuração não se aplica ao tipo de dado
JSON.Int64; se pelo menos um número for de ponto flutuante, o tipo resultante será Float64.
Se os dados de amostra contiverem apenas inteiros e pelo menos um deles for positivo e exceder o limite de Int64, o ClickHouse inferirá UInt64.
Habilitada por padrão.
Exemplos
input_format_try_infer_datetimes
DateTime ou DateTime64 a partir de campos do tipo string na inferência de esquema para formatos de texto.
Se todos os campos de uma coluna nos dados de amostra forem analisados com sucesso como datetimes, o tipo resultante será DateTime ou DateTime64(9) (se algum datetime tiver parte fracionária),
se pelo menos um campo não for analisado como datetime, o tipo resultante será String.
Habilitado por padrão.
Exemplos
input_format_try_infer_datetimes_only_datetime64
DateTime64(9) quando input_format_try_infer_datetimes estiver habilitado, mesmo que os valores de data e hora não contenham parte fracionária.
Desabilitado por padrão.
Exemplos
input_format_try_infer_dates
Date a partir de campos do tipo string na inferência de esquema para formatos de texto.
Se todos os campos de uma coluna nos dados de amostra forem analisados com sucesso como datas, o tipo resultante será Date;
se pelo menos um campo não for analisado como data, o tipo resultante será String.
Habilitado por padrão.
Exemplos
input_format_try_infer_exponent_floats
Formatos autodescritivos
Formatos com o sufixo -WithNamesAndTypes
Formatos JSON com metadados
Avro
Outros tipos do Avro não são compatíveis.
Parquet
Outros tipos do Parquet não são compatíveis.
Arrow
Outros tipos do Arrow não são compatíveis.
ORC
Outros tipos de ORC não são compatíveis.
Native
Formatos com esquema externo
Protobuf
CapnProto
Formatos binários fortemente tipados
input_format_max_rows_to_read_for_schema_inference linhas ou input_format_max_bytes_to_read_for_schema_inference bytes) e extrai
o tipo (e possivelmente o nome) de cada valor a partir dos dados, convertendo então esses tipos em tipos do ClickHouse.
MsgPack
input_format_msgpack_number_of_columns. O ClickHouse usa as seguintes correspondências de tipos:
Por padrão, todos os tipos inferidos são
Nullable, mas isso pode ser alterado usando a configuração schema_inference_make_columns_nullable.
BSONEachRow
Por padrão, todos os tipos inferidos ficam dentro de
Nullable, mas isso pode ser alterado usando a configuração schema_inference_make_columns_nullable.
Formatos com esquema fixo
LineAsString
String. O tipo inferido para esse formato é sempre String, e o nome da coluna é line.
Exemplo
JSONAsString
String. O tipo inferido para esse formato é sempre String, e o nome da coluna é json.
Exemplo
JSONAsObject
JSON. O tipo inferido para esse formato é sempre JSON, e o nome da coluna é json.
Exemplo
Modos de inferência de esquema
default e union.
O modo é controlado pela configuração schema_inference_mode.
Modo padrão
data1.jsonl, data2.jsonl e data3.jsonl com o seguinte conteúdo:
data1.jsonl:
data2.jsonl:
data3.jsonl:
Query
Response
field3 do arquivo data3.jsonl.
Isso acontece porque o ClickHouse primeiro tentou inferir o esquema a partir do arquivo data1.jsonl, mas falhou porque o campo field2 continha apenas valores nulos,
e então tentou inferir o esquema a partir de data2.jsonl e conseguiu, portanto os dados do arquivo data3.jsonl não foram lidos.
Modo union
data1.jsonl, data2.jsonl e data3.jsonl com o seguinte conteúdo:
data1.jsonl:
data2.jsonl:
data3.jsonl:
Query
Response
- Como alguns arquivos podem não conter algumas colunas do esquema resultante, o modo union é compatível apenas com formatos que suportam a leitura de subconjuntos de colunas (como JSONEachRow, Parquet, TSVWithNames etc.) e não funcionará com outros formatos (como CSV, TSV, JSONCompactEachRow etc.).
- Se o ClickHouse não conseguir inferir o esquema de um dos arquivos, uma exceção será lançada.
- Se você tiver muitos arquivos, ler o esquema de todos eles pode levar bastante tempo.
Detecção automática de formato
data com o seguinte conteúdo:
O ClickHouse consegue detectar apenas alguns formatos, e essa detecção leva algum tempo; por isso, é sempre melhor especificar o formato explicitamente.