TSV por CSV en los argumentos de formato.
Mientras avanza por esta guía, hará lo siguiente:
- Investigar: consultar la estructura y el contenido del archivo TSV.
- Determinar el esquema de destino de ClickHouse: elegir los tipos de datos adecuados y asignar los datos existentes a esos tipos.
- Crear una tabla de ClickHouse.
- Preprocesar y transmitir los datos a ClickHouse.
- Ejecutar algunas consultas en ClickHouse.
Requisitos previos
- Descargue el conjunto de datos visitando la página NYPD Complaint Data Current (Year To Date), haciendo clic en el botón Export y seleccionando TSV for Excel.
- Instale el servidor y cliente de ClickHouse
Una nota sobre los comandos descritos en esta guía
- Algunos de los comandos consultan archivos TSV; estos se ejecutan en la línea de comandos.
- El resto de los comandos consultan ClickHouse y se ejecutan en
clickhouse-cliento en la UI de Play.
Los ejemplos de esta guía asumen que ha guardado el archivo TSV en
${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv; ajuste los comandos si es necesario.Familiarícese con el archivo TSV
Observa los campos del archivo TSV de origen
Query
clickhouse-local para consultar los datos del archivo TSV que descargó.
Query
Response
Nullable(Float64) y todos los demás campos como Nullable(String). Cuando crees una tabla de ClickHouse para almacenar los datos, podrás especificar tipos más adecuados y con mejor rendimiento.
Determinar el esquema adecuado
JURISDICTION_CODE es numérico: ¿debería ser UInt8, Enum o Float64?
Query
Response
JURISDICTION_CODE cabe bien en un UInt8.
Del mismo modo, revisa algunos de los campos String y comprueba si serían más adecuados como campos DateTime o LowCardinality(String).
Por ejemplo, el campo PARKS_NM se describe como “Nombre del parque, zona de juegos o área verde de NYC donde ocurre el hecho, si corresponde (no se incluyen los parques estatales)”. Los nombres de los parques de la ciudad de Nueva York pueden ser un buen candidato para LowCardinality(String):
Query
Response
Query
Response
PARK_NM. Se trata de una cantidad pequeña según la recomendación de LowCardinality de mantenerse por debajo de 10,000 cadenas distintas en un campo LowCardinality(String).
Campos de fecha y hora
CMPLNT_FR_DT y CMPLT_TO_DT permite hacerse una idea de si esos campos siempre están rellenados o no:
Query
Response
Query
Response
Query
Response
Query
Response
Elabora un plan
JURISDICTION_CODEdebe convertirse enUInt8.PARKS_NMdebe convertirse enLowCardinality(String)CMPLNT_FR_DTyCMPLNT_FR_TMsiempre están rellenos (posiblemente con una hora predeterminada de00:00:00)CMPLNT_TO_DTyCMPLNT_TO_TMpueden estar vacíos- Las fechas y las horas se almacenan en campos separados en el origen
- Las fechas tienen el formato
mm/dd/yyyy - Las horas tienen el formato
hh:mm:ss - Las fechas y las horas pueden concatenarse en tipos
DateTime - Hay algunas fechas anteriores al 1 de enero de 1970, lo que significa que necesitamos un
DateTimede 64 bits
Hay muchos más cambios que hacer en los tipos; todos pueden determinarse siguiendo los mismos pasos de investigación. Observa la cantidad de cadenas distintas en un campo, el mínimo y el máximo de los valores numéricos, y toma tus decisiones. El esquema de la tabla que se proporciona más adelante en la guía tiene muchas cadenas de baja cardinalidad y campos enteros sin signo, y muy pocos valores numéricos de coma flotante.
Concatenar los campos de fecha y hora
CMPLNT_FR_DT y CMPLNT_FR_TM en un único String que pueda convertirse en DateTime, seleccione ambos campos unidos por el operador de concatenación: CMPLNT_FR_DT || ' ' || CMPLNT_FR_TM. Los campos CMPLNT_TO_DT y CMPLNT_TO_TM se tratan de forma similar.
Query
Response
Convertir la cadena de fecha y hora a un tipo DateTime64
MM/DD/YYYY al formato YYYY/MM/DD. Ambas cosas pueden hacerse con parseDateTime64BestEffort().
Query
DateTime64. Como no se garantiza que exista la hora de finalización de la reclamación, se usa parseDateTime64BestEffortOrNull.
Response
Las fechas que aparecen arriba como
1925 se deben a errores en los datos. Hay varios registros en los datos originales con fechas en los años 1019 - 1022 que deberían ser 2019 - 2022. Se almacenan como 1 de enero de 1925, ya que esa es la fecha más antigua compatible con un DateTime de 64 bits.Crear una tabla
ORDER BY y PRIMARY KEY se usarán en la tabla. Al menos uno
de ORDER BY o PRIMARY KEY debe especificarse. A continuación, se ofrecen algunas pautas para decidir qué
columnas incluir en ORDER BY; encontrarás más información en la sección Próximos pasos al final
de este documento.
Cláusulas ORDER BY y PRIMARY KEY
- La tupla
ORDER BYdebe incluir los campos que se usan en los filtros de las consultas - Para maximizar la compresión en disco, la tupla
ORDER BYdebe ordenarse por cardinalidad ascendente - Si existe, la tupla
PRIMARY KEYdebe ser un subconjunto de la tuplaORDER BY - Si solo se especifica
ORDER BY, se usará la misma tupla comoPRIMARY KEY - El índice de la clave primaria se crea usando la tupla
PRIMARY KEYsi se especifica; de lo contrario, la tuplaORDER BY - El índice
PRIMARY KEYse mantiene en la memoria principal
ORDER BY:
Consultando el archivo TSV para obtener la cardinalidad de las tres columnas candidatas:
Query
Response
ORDER BY queda así:
La siguiente tabla usará nombres de columna más fáciles de leer; los nombres anteriores se corresponderán con
ORDER BY, se obtiene esta estructura de la tabla:
Cómo encontrar la clave primaria de una tabla
system de ClickHouse, en concreto system.table, contiene toda la información sobre la tabla que
acabas de crear. Esta consulta muestra el ORDER BY (clave de ordenación) y la PRIMARY KEY:
Preprocesamiento e importación de datos
clickhouse-local para el preprocesamiento de los datos y clickhouse-client para cargarlos.
Argumentos de clickhouse-local utilizados
Valida los datos
El conjunto de datos cambia una o varias veces al año, por lo que es posible que tus recuentos no coincidan con lo que aparece en este documento.
Query
Response
Query
Response
Ejecuta algunas consultas
Consulta 1. Compare el número de quejas por mes
Query
Response
Consulta 2. Comparar el número total de quejas por distrito
Query
Response