En este tutorial, insertarás 28 millones de filas de datos de Hacker News en una tabla de ClickHouse desde archivos CSV y Parquet, y ejecutarás algunas consultas sencillas para explorar los datos.
CSV
1
Descargar CSV
Se puede descargar una versión en CSV del conjunto de datos desde nuestro bucket público de S3, o ejecutando este comando:Con 4,6 GB y 28 millones de filas, este archivo comprimido debería tardar entre 5 y 10 minutos en descargarse.
2
Tomar una muestra de los datos
clickhouse-local permite procesar rápidamente archivos locales sin
tener que desplegar y configurar el servidor de ClickHouse.Antes de almacenar datos en ClickHouse, tomemos una muestra del archivo con clickhouse-local.
En la consola, ejecute:Query
Response
file le permite leer el archivo desde un disco local, especificando solo el formato CSVWithNames.
Lo más importante es que el esquema se infiere automáticamente a partir del contenido del archivo.
Observe también cómo clickhouse-local puede leer el archivo comprimido, infiriendo el formato gzip a partir de la extensión.
El formato Vertical se utiliza para ver más fácilmente los datos de cada columna.3
Cargar los datos con inferencia de esquema
La herramienta más sencilla y potente para cargar datos es Esto crea una tabla vacía usando el esquema inferido a partir de los datos.
El comando Para insertar los datos en esta tabla, use el comando ¡Has insertado 28 millones de filas en ClickHouse con un solo comando!
clickhouse-client: un cliente nativo de línea de comandos con numerosas funciones.
Para cargar datos, también puedes aprovechar la inferencia de esquema y dejar que ClickHouse determine los tipos de las columnas.Ejecuta el siguiente comando para crear una tabla e insertar los datos directamente desde el archivo CSV remoto, accediendo al contenido mediante la función url.
El esquema se infiere automáticamente:DESCRIBE TABLE nos permite ver los tipos asignados.Query
Response
INSERT INTO, SELECT.
Con la función url, los datos se transmitirán directamente desde la URL:4
Explorar los datos
Obtenga una muestra de las historias de Hacker News y de columnas concretas ejecutando la siguiente consulta:Aunque la inferencia de esquemas es una excelente herramienta para la exploración inicial de datos, funciona con un criterio de «mejor esfuerzo» y no sustituye a largo plazo la definición de un esquema óptimo para sus datos.
Query
Response
5
Definir un esquema
Una optimización inmediata y evidente es definir un tipo para cada campo.
Además de declarar el campo de tiempo como de tipo Con un esquema optimizado, ahora puedes insertar los datos desde el sistema de archivos local.
Una vez más, con
DateTime, definimos un tipo adecuado para cada uno de los campos siguientes después de eliminar el dataset existente.
En ClickHouse, el id de la clave primaria de los datos se define mediante la cláusula ORDER BY.Seleccionar los tipos adecuados y elegir qué columnas incluir en la cláusula ORDER BY
ayudará a mejorar la velocidad de las consultas y la compresión.Ejecute la consulta siguiente para eliminar el esquema anterior y crear el esquema mejorado:Query
clickhouse-client, inserta el archivo mediante la cláusula INFILE con un INSERT INTO explícito.Query
6
Ejecutar consultas de muestra
A continuación se presentan algunas consultas de ejemplo para que puedas inspirarte
al escribir tus propias consultas.¿Está ClickHouse generando más ruido con el tiempo? Aquí se muestra la utilidad de definir el campo Parece que “ClickHouse” está ganando popularidad con el paso del tiempo.
¿Con qué frecuencia aparece el tema “ClickHouse” en Hacker News?
El campo score proporciona una métrica de popularidad para las historias, mientras que el campoid y el operador de concatenación || pueden usarse para generar un enlace a la publicación original.Query
Response
time
como DateTime, ya que usar un tipo de dato adecuado permite utilizar la función toYYYYMM():Query
Response
¿Quiénes son los principales comentaristas en los artículos relacionados con ClickHouse?
Query
Response
¿Qué comentarios generan más interés?
Query
Response
Parquet
1
Inserte los datos
Ejecute la siguiente consulta para leer los mismos datos en formato Parquet, utilizando de nuevo la función Ejecute el siguiente comando para ver el esquema inferido:Los pasos restantes usan nombres de columna más claros, como
url para leer los datos remotos:Claves nulas en ParquetEl esquema inferido define las columnas como
Nullable, por lo que se requiere allow_nullable_key, aunque este conjunto de datos no contiene
ID nulos.Query
Response
author y comment, por lo que debe continuar con un esquema especificado manualmente.
Primero, elimine la tabla inferida; a continuación, cree la tabla e inserte los datos directamente desde el bucket público de S3:2
Añada un índice de texto para agilizar las búsquedas
Para saber cuántos comentarios mencionan “ClickHouse”, ejecuta la siguiente consulta:A continuación, cree un índice de texto en la columna La materialización crea el índice para los datos existentes. La configuración El resultado sigue siendo el mismo porque el índice cambia la forma en que ClickHouse encuentra las filas coincidentes, no cuáles coinciden. La consulta indexada
procesa considerablemente menos datos y se completa mucho más rápido.
Use La entrada Use
Query
Response
comment
para acelerar esta consulta. Un índice de texto utiliza un índice invertido que asigna los tokens a las filas que los contienen.
El tokenizador splitByNonAlpha divide el texto por caracteres no alfanuméricos. El índice y las consultas usan lower(comment)
con términos de búsqueda en minúsculas, por lo que las coincidencias no distinguen entre mayúsculas y minúsculas. La expresión de la consulta debe coincidir con la expresión indexada.Ejecute los siguientes comandos para crear el índice:mutations_sync espera a que finalice la materialización.
Puede consultar la definición del índice en la tabla system.data_skipping_indices.Ejecute de nuevo la misma consulta una vez materializado el índice:Query
Response
EXPLAIN para confirmar que ClickHouse tiene previsto aplicar el índice:Query
Response
comment_idx muestra que ClickHouse prevé aplicar el índice de texto. En este ejemplo, el plan selecciona 547 de 3527
gránulos, lo que reduce considerablemente la cantidad de datos examinados.También puede buscar uno o varios tokens. Estas funciones buscan coincidencias con tokens completos generados por el tokenizador del índice.
Use hasAnyTokens cuando deba coincidir al menos un token:Query
Response
hasAllTokens cuando todos los tokens deban coincidir, en cualquier orden:Query
Response