TSV por CSV nos argumentos de formato.
Ao seguir este guia, você vai:
- Investigar: consultar a estrutura e o conteúdo do arquivo TSV.
- Determinar o esquema de destino no ClickHouse: escolher os tipos de dados adequados e mapear os dados existentes para esses tipos.
- Criar uma tabela no ClickHouse.
- Pré-processar e enviar em stream os dados para o ClickHouse.
- Executar algumas consultas no ClickHouse.
Pré-requisitos
- Baixe o conjunto de dados acessando a página NYPD Complaint Data Current (Year To Date), clicando no botão Export e selecionando TSV for Excel.
- Instale o servidor e o cliente do ClickHouse
Uma observação sobre os comandos descritos neste guia
- Alguns comandos consultam os arquivos TSV; eles são executados no prompt de comando.
- Os demais comandos consultam o ClickHouse e são executados no
clickhouse-clientou na UI Play.
Os exemplos neste guia pressupõem que você salvou o arquivo TSV em
${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv; ajuste os comandos, se necessário.Conheça o arquivo TSV
Veja os campos do arquivo TSV de origem
Query
clickhouse-local para consultar os dados no arquivo TSV que baixou.
Query
Response
Nullable(Float64), e todos os demais campos como Nullable(String). Ao criar uma tabela no ClickHouse para armazenar os dados, você pode especificar tipos mais adequados e com melhor desempenho.
Determine o esquema adequado
JURISDICTION_CODE é numérico: ele deve ser UInt8 ou Enum, ou Float64 seria apropriado?
Query
Response
JURISDICTION_CODE se ajusta bem a um UInt8.
Da mesma forma, examine alguns dos campos String e veja se eles se encaixam bem como campos DateTime ou LowCardinality(String).
Por exemplo, o campo PARKS_NM é descrito como “Nome do parque, playground ou área verde em Nova York onde ocorreu o registro, se aplicável (parques estaduais não estão incluídos)”. Os nomes dos parques da cidade de Nova York podem ser um bom candidato para LowCardinality(String):
Query
Response
Query
Response
PARK_NM. Esse é um número baixo, com base na recomendação de LowCardinality de manter menos de 10.000 strings distintas em um campo LowCardinality(String).
Campos DateTime
CMPLNT_FR_DT e CMPLT_TO_DT ajuda a entender se esses campos são sempre preenchidos ou não:
Query
Response
Query
Response
Query
Response
Query
Response
Elabore um plano
JURISDICTION_CODEdeve ser convertido paraUInt8.PARKS_NMdeve ser convertido paraLowCardinality(String)CMPLNT_FR_DTeCMPLNT_FR_TMestão sempre preenchidos (possivelmente com o horário padrão00:00:00)CMPLNT_TO_DTeCMPLNT_TO_TMpodem estar vazios- As datas e os horários são armazenados em campos separados na origem
- As datas estão no formato
mm/dd/yyyy - Os horários estão no formato
hh:mm:ss - Datas e horários podem ser concatenados em tipos DateTime
- Há algumas datas anteriores a 1º de janeiro de 1970, o que significa que precisamos de um DateTime de 64 bits
Há muitas outras alterações a serem feitas nos tipos, e todas elas podem ser determinadas seguindo as mesmas etapas de investigação. Observe o número de strings distintas em um campo, os valores mínimo e máximo dos números e tome suas decisões. O esquema da tabela apresentado mais adiante no guia tem muitas strings de baixa cardinalidade e campos inteiros sem sinal, além de pouquíssimos números de ponto flutuante.
Concatene os campos de data e hora
CMPLNT_FR_DT e CMPLNT_FR_TM em uma única String que possa ser convertida para DateTime, selecione os dois campos unidos pelo operador de concatenação: CMPLNT_FR_DT || ' ' || CMPLNT_FR_TM. Os campos CMPLNT_TO_DT e CMPLNT_TO_TM são tratados da mesma forma.
Query
Response
Converta a String de data e hora em um tipo DateTime64
MM/DD/YYYY para YYYY/MM/DD. Ambas as tarefas podem ser feitas com parseDateTime64BestEffort().
Query
DateTime64. Como não há garantia de que o horário de término da reclamação exista, usa-se parseDateTime64BestEffortOrNull.
Response
As datas exibidas acima como
1925 se devem a erros nos dados. Há vários registros nos dados originais com datas nos anos 1019 - 1022 que deveriam ser 2019 - 2022. Essas datas estão sendo armazenadas como 1º de janeiro de 1925, pois essa é a data mais antiga compatível com um DateTime de 64 bits.Criar uma tabela
ORDER BY e a PRIMARY KEY da tabela. Pelo menos um
entre ORDER BY e PRIMARY KEY deve ser especificado. Aqui estão algumas diretrizes para decidir quais
colunas incluir em ORDER BY; mais informações estão na seção Próximos passos no final
deste documento.
Cláusulas ORDER BY e PRIMARY KEY
- A tupla
ORDER BYdeve incluir campos usados nos filtros da consulta - Para maximizar a compressão em disco, a tupla
ORDER BYdeve ser ordenada por cardinalidade crescente - Se existir, a tupla
PRIMARY KEYdeve ser um subconjunto da tuplaORDER BY - Se apenas
ORDER BYfor especificada, a mesma tupla será usada comoPRIMARY KEY - O índice da chave primária é criado usando a tupla
PRIMARY KEY, se especificada; caso contrário, a tuplaORDER BY - O índice
PRIMARY KEYé mantido na memória principal
ORDER BY:
Consultando o arquivo TSV para a cardinalidade das três colunas candidatas:
Query
Response
ORDER BY fica:
A tabela abaixo usará nomes de colunas mais fáceis de ler; os nomes acima serão mapeados para
ORDER BY, chega-se a esta estrutura de tabela:
Encontrando a chave primária de uma tabela
system do ClickHouse, mais especificamente system.table, contém todas as informações sobre a tabela que você
acabou de criar. Esta consulta mostra o ORDER BY (chave de ordenação) e a PRIMARY KEY:
Pré-processar e importar dados
clickhouse-local para pré-processar os dados e o clickhouse-client para enviá-los.
Argumentos usados no clickhouse-local
Valide os dados
O conjunto de dados muda uma ou mais vezes por ano, então suas contagens podem não corresponder às deste documento.
Query
Response
Query
Response
Execute algumas consultas
Consulta 1. Compare o número de reclamações por mês
Query
Response
Consulta 2. Compare o número total de reclamações por distrito
Query
Response