clickhouse-local ou em buckets do S3, e/ou criar esquemas automaticamente antes de carregar os dados no ClickHouse.
Quando usar inferência de tipos
- Estrutura consistente - Os dados com base nos quais você vai inferir os tipos contêm todas as chaves de interesse. A inferência de tipos se baseia na amostragem dos dados até um número máximo de linhas ou de bytes. Dados além da amostra, com colunas adicionais, serão ignorados e não poderão ser consultados.
- Tipos consistentes - Os tipos de dados de chaves específicas precisam ser compatíveis, ou seja, deve ser possível converter automaticamente um tipo em outro.
Detectando tipos
NDJSON. Nesta seção, exploramos um conjunto de dados mais complexo, com estruturas aninhadas: o conjunto de dados arXiv, que contém 2,5 milhões de artigos acadêmicos. Cada linha desse conjunto de dados, distribuído em NDJSON, representa um artigo acadêmico publicado. Um exemplo de linha é mostrado abaixo:
Tuple e Array.
Esse conjunto de dados está armazenado em um bucket do S3 público em s3://datasets-documentation/arxiv/arxiv.json.gz.
Você pode ver que o conjunto de dados acima contém objetos JSON aninhados. Embora seja recomendável definir e versionar seus esquemas, a inferência permite deduzir os tipos a partir dos dados. Isso permite gerar automaticamente o DDL do esquema, evitando a necessidade de montá-lo manualmente e acelerando o processo de desenvolvimento.
Detecção automática de formatoAlém de detectar o esquema, a inferência de esquema JSON também infere automaticamente o formato dos dados com base na extensão e no conteúdo do arquivo. Como resultado, o arquivo acima é detectado automaticamente como NDJSON.
DESCRIBE mostra os tipos que serão inferidos.
Evite valores nulosVocê pode ver que muitas colunas são detectadas como Nullable. Não recomendamos usar o tipo Nullable quando isso não for absolutamente necessário. Você pode usar schema_inference_make_columns_nullable para controlar quando Nullable será aplicado.
String, com a coluna update_date detectada corretamente como Date. A coluna versions foi criada como Array(Tuple(created String, version String)) para armazenar uma lista de objetos, e authors_parsed foi definida como Array(Array(String)) para arrays aninhados.
Controle da detecção de tiposA detecção automática de datas e DateTimes pode ser controlada, respectivamente, pelas configurações
input_format_try_infer_dates e input_format_try_infer_datetimes (ambas ativadas por padrão). A inferência de objetos como Tuples é controlada pela configuração input_format_json_try_infer_named_tuples_from_objects. Outras configurações que controlam a inferência de esquema para JSON, como a detecção automática de números, podem ser encontradas aqui.Consultando JSON
Criando tabelas
CREATE AS EMPTY a seguir faz com que o DDL da tabela seja inferido e a tabela seja criada. Isso não carrega nenhum dado:
SHOW CREATE TABLE:
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). Se a detecção não estiver correta, você pode fornecer dicas conforme descrito aqui.
Criando tabelas a partir de snippets
Carregamento de dados JSON
INSERT INTO SELECT:
PrettyJSONEachRow para exibir as linhas em sua estrutura original:
Tratando erros
input_format_allow_errors_num e input_format_allow_errors_ratio para permitir que um determinado número de linhas seja ignorado se os dados estiverem causando erros de inserção. Além disso, dicas podem ser fornecidas para ajudar na inferência.
Trabalhando com dados semi-estruturados e dinâmicos
JSON específico.
Se você sabe que seu JSON é altamente dinâmico, com muitas chaves exclusivas e vários tipos para as mesmas chaves, recomendamos não usar a inferência de esquema com JSONEachRow para tentar inferir uma coluna para cada chave — mesmo que os dados estejam no formato JSON delimitado por quebras de linha.
Considere o exemplo a seguir, de uma versão estendida do Python PyPI conjunto de dados acima. Aqui, adicionamos uma coluna tags arbitrária com pares aleatórios de chave-valor.
JSONEachRow é usado para inferência. Ele tenta inferir um tipo de coluna para cada chave no JSON — na prática, tentando aplicar um esquema estático aos dados sem usar o tipo JSON.
Com milhares de colunas únicas, essa abordagem de inferência é lenta. Como alternativa, você pode usar o formato JSONAsObject.
JSONAsObject trata toda a entrada como um único objeto JSON e a armazena em uma única coluna do tipo JSON, o que o torna mais adequado para payloads JSON altamente dinâmicos ou aninhados.
sample.json com o seguinte JSON delimitado por quebras de linha:
a como Nullable(String).
Coerção de tiposEssa coerção de tipos pode ser controlada por meio de várias configurações. O exemplo acima depende da configuração
input_format_json_read_numbers_as_strings.DESCRIBE falha:
JSONAsObject trata cada linha como um único tipo JSON (que permite que a mesma coluna tenha múltiplos tipos). Isso é essencial: