Neste tutorial, você vai inserir 28 milhões de linhas do Hacker News em uma tabela do ClickHouse usando os formatos CSV e Parquet e executar algumas consultas simples para explorar os dados.
CSV
1
Baixar CSV
Uma versão CSV do conjunto de dados pode ser baixada do nosso bucket do S3 público ou com a execução deste comando:Com 4,6 GB e 28 milhões de linhas, este arquivo comprimido deve levar de 5 a 10 minutos para baixar.
2
Faça uma amostragem dos dados
clickhouse-local permite processar arquivos locais rapidamente sem
precisar implantar e configurar o servidor ClickHouse.Antes de armazenar qualquer dado no ClickHouse, vamos fazer uma amostragem do arquivo usando o clickhouse-local.
No console, execute:Query
Response
file permite ler o arquivo a partir de um disco local, especificando apenas o formato CSVWithNames.
O mais importante é que o esquema é inferido automaticamente a partir do conteúdo do arquivo.
Observe também como o clickhouse-local consegue ler o arquivo comprimido, inferindo o formato gzip pela extensão.
O formato Vertical é usado para facilitar a visualização dos dados de cada coluna.3
Carregue os dados com inferência de esquema
A ferramenta mais simples e poderosa para carregar dados é o Isso cria uma tabela vazia usando o esquema inferido a partir dos dados.
O comando Para inserir os dados nesta tabela, use o comando Você inseriu 28 milhões de linhas no ClickHouse com um único comando!
clickhouse-client: um cliente nativo de linha de comando completo.
Para carregar dados, você pode mais uma vez usar a inferência de esquema, deixando que o ClickHouse determine os tipos das colunas.Execute o comando abaixo para criar uma tabela e inserir os dados diretamente do arquivo CSV remoto, acessando seu conteúdo por meio da função url.
O esquema é inferido automaticamente:DESCRIBE TABLE nos permite entender quais tipos foram atribuídos.Query
Response
INSERT INTO, SELECT.
Com a função url, os dados serão lidos diretamente da URL:4
Explore os dados
Obtenha uma amostra das histórias do Hacker News e de colunas específicas executando a consulta a seguir:Embora a inferência de esquema seja uma ótima ferramenta para a exploração inicial dos dados, ela funciona com base no melhor esforço e não substitui, no longo prazo, a definição de um esquema ideal para seus dados.
Query
Response
5
Defina um esquema
Uma otimização imediata e óbvia é definir um tipo para cada campo.
Além de declarar o campo de tempo como do tipo Com um esquema otimizado, agora você pode inserir os dados a partir do sistema de arquivos local.
Novamente com o
DateTime, definimos um tipo apropriado para cada um dos campos abaixo após remover o conjunto de dados existente.
No ClickHouse, o id da chave primária dos dados é definido por meio da cláusula ORDER BY.Selecionar os tipos apropriados e escolher quais colunas incluir na cláusula ORDER BY
ajudará a melhorar a velocidade das consultas e a compressão.Execute a consulta abaixo para remover o esquema antigo e criar o esquema aprimorado:Query
clickhouse-client, insira o arquivo usando a cláusula INFILE, com um INSERT INTO explícito.Query
6
Executar consultas de exemplo
Algumas consultas de exemplo são apresentadas abaixo para inspirar você a escrever
suas próprias consultas.O ClickHouse está gerando mais ruído ao longo do tempo? Aqui fica evidente a utilidade de definir o campo Parece que o “ClickHouse” está crescendo em popularidade com o tempo.
Com que frequência o tema “ClickHouse” aparece no Hacker News?
O campo score fornece uma métrica de popularidade para as histórias, enquanto o campoid e o operador de concatenação ||
podem ser usados para gerar um link para a publicação original.Query
Response
time
como DateTime, pois usar um tipo de dado adequado permite utilizar a função toYYYYMM():Query
Response
Quem são os que mais comentam em artigos relacionados ao ClickHouse?
Query
Response
Quais comentários geram mais interesse?
Query
Response
Parquet
1
Insira os dados
Execute a consulta a seguir para ler os mesmos dados no formato Parquet, usando novamente a função Execute o comando a seguir para visualizar o esquema inferido:As etapas restantes usam nomes de coluna mais claros, como
url para ler os dados remotos:Chaves nulas no ParquetO esquema inferido define as colunas como
Nullable, portanto allow_nullable_key é necessário, embora este conjunto de dados não contenha
IDs nulos.Query
Response
author e comment, portanto, continue com um schema definido manualmente.
Primeiro, exclua a tabela inferida. Em seguida, crie a tabela e insira os dados diretamente do bucket público do S3:2
Adicione um índice de texto para acelerar as pesquisas
Para saber quantos comentários mencionam “ClickHouse”, execute a seguinte consulta:Em seguida, crie um índice de texto na coluna A materialização cria o índice para os dados existentes. A configuração O resultado permanece o mesmo porque o índice altera como o ClickHouse encontra as linhas correspondentes, e não quais linhas correspondem. A consulta indexada
processa consideravelmente menos dados e é concluída muito mais rápido.
Use A entrada Use
Query
Response
comment
para acelerar esta consulta. Um índice de texto usa um índice invertido que mapeia tokens às linhas que os contêm.
O tokenizador splitByNonAlpha divide o texto em caracteres não alfanuméricos. O índice e as consultas usam lower(comment)
com termos de busca em minúsculas, de modo que a correspondência não diferencia maiúsculas de minúsculas. A expressão da consulta deve corresponder à expressão indexada.Execute os comandos a seguir para criar o índice:mutations_sync aguarda a conclusão da materialização.
Você pode verificar a definição do índice na tabela system.data_skipping_indices.Execute novamente a mesma consulta após a materialização do índice:Query
Response
EXPLAIN para confirmar que o ClickHouse pretende aplicar o índice:Query
Response
comment_idx mostra que o ClickHouse planeja aplicar o índice de texto. Neste exemplo, o plano seleciona 547 dos 3527
grânulos, reduzindo substancialmente a quantidade de dados analisados.Você também pode pesquisar um ou todos entre vários tokens. Essas funções correspondem a tokens completos produzidos pelo tokenizador do índice.
Use hasAnyTokens quando pelo menos um token precisar corresponder:Query
Response
hasAllTokens quando todos os tokens precisarem corresponder, em qualquer ordem:Query
Response