En esta guía, aprenderás a usar arrays en ClickHouse junto con algunas de las funciones para arrays más utilizadas.
Introducción a los arrays
array:
[]:
Creación de arrays de distintos tipos
Creación de arrays de distintos tipos
Puede usar la configuración También puede leer los tipos del array por nombre de tipo:
use_variant_as_common_type para cambiar el comportamiento predeterminado descrito anteriormente.
Esto le permite usar el tipo Variant como tipo de resultado para las funciones if/multiIf/array/map cuando no existe un tipo común para los tipos de argumento.Por ejemplo:[] ofrece una forma práctica de acceder a los elementos de un array.
En ClickHouse, es importante saber que el índice del array siempre comienza en 1.
Esto puede diferir de otros lenguajes de programación con los que esté familiarizado, donde los arrays se indexan desde cero.
Por ejemplo, dado un array, puedes seleccionar el primer elemento de un array escribiendo:
Funciones de arrays
funciones length, arrayEnumerate, indexOf y has*
length se utiliza para devolver la cantidad de elementos del array:
arrayEnumerate para devolver un array con los índices de los elementos:
indexOf:
indexOfAssumeSorted.
Las funciones has, hasAll y hasAny son útiles para determinar si un array contiene un valor determinado.
Considera el siguiente ejemplo:
Exploración de datos de vuelos con funciones de arrays
groupArray
groupArray, que toma los valores de la columna especificada de cada fila y los agrupa en un Array.
Ejecuta la siguiente consulta para ver cómo funciona:
La función toStringCutToZero de la consulta anterior se usa para eliminar los caracteres nulos que aparecen después del código de 3 letras de algunos aeropuertos.
Con los datos en este formato, podemos determinar fácilmente el orden de los aeropuertos con más tráfico calculando la longitud de los Arrays “Destinations” agrupados:
arrayMap y arrayZip
arrayMap es un ejemplo de este tipo de funciones de orden superior y devuelve un nuevo array a partir del array proporcionado al aplicar una función lambda a cada elemento del array original.
Ejecuta la consulta siguiente, que usa la función arrayMap, para ver qué vuelos se retrasaron y cuáles salieron a tiempo.
Para cada par de origen/destino, muestra la matrícula y el estado de cada vuelo:
En la consulta anterior, la función arrayMap toma un array de un solo elemento [DepDelayMinutes] y le aplica la función lambda d -> if(d >= 30, 'DELAYED', if(d >= 15, 'WARNING', 'ON-TIME' para clasificarlo.
A continuación, el primer elemento del array resultante se extrae con [DepDelayMinutes][1].
La función arrayZip combina el array Tail_Number y el array statuses en un único array.
arrayFilter
DEN, ATL y DFW:
En la consulta anterior, pasamos una función lambda como primer argumento a la función arrayFilter.
Esta función lambda toma el retraso en minutos (d) y devuelve 1 si se cumple la condición; de lo contrario, 0.
arraySort y arrayIntersect
arraySort y arrayIntersect.
arraySort toma un array y ordena sus elementos en orden ascendente de forma predeterminada, aunque también puedes pasarle una función lambda para definir el orden de clasificación.
arrayIntersect toma varios arrays y devuelve un array que contiene los elementos presentes en todos ellos.
Ejecuta la consulta siguiente para ver estas dos funciones de arrays en acción:
La consulta funciona en dos etapas principales.
Primero, crea un conjunto de datos temporal llamado airport_routes mediante una Common Table Expression (CTE) que analiza todos los vuelos del 1 de enero de 2024 y, para cada aeropuerto de origen, construye una lista ordenada de todos los destinos únicos a los que vuela ese aeropuerto.
En el conjunto de resultados de airport_routes, por ejemplo, DEN podría tener un array con todas las ciudades a las que vuela, como ['ATL', 'BOS', 'LAX', 'MIA', ...], y así sucesivamente.
En la segunda etapa, la consulta toma cinco grandes aeropuertos principales de EE. UU. (DEN, ATL, DFW, ORD y LAS) y compara todos los pares posibles entre ellos.
Lo hace mediante un cross join, que crea todas las combinaciones de estos aeropuertos.
Luego, para cada par, usa la función arrayIntersect para encontrar qué destinos aparecen en las listas de ambos aeropuertos.
La función length cuenta cuántos destinos tienen en común.
La condición a1.Origin < a2.Origin garantiza que cada par aparezca solo una vez.
Sin esto, obtendrías tanto JFK-LAX como LAX-JFK como resultados independientes, lo que sería redundante porque representan la misma comparación.
Por último, la consulta ordena los resultados para mostrar qué pares de aeropuertos tienen el mayor número de destinos compartidos y devuelve solo los 10 primeros.
Esto revela qué grandes hubs tienen las redes de rutas más solapadas, lo que podría indicar mercados competitivos en los que varias aerolíneas operan las mismas rutas entre ciudades, o hubs que dan servicio a regiones geográficas similares y que podrían utilizarse como puntos de conexión alternativos para los viajeros.
arrayReduce
arrayReduce, para encontrar el retraso medio y el máximo
de cada ruta desde el Aeropuerto Internacional de Denver:
En el ejemplo anterior, usamos arrayReduce para encontrar el retraso medio y el máximo de varios vuelos con salida desde DEN.
arrayReduce aplica una función de agregado, especificada en el primer parámetro de la función, a los elementos del array proporcionado, especificado en el segundo parámetro de la función.
arrayJoin
arrayJoin.
arrayJoin “explota” un array, creando una fila independiente para cada elemento.
Esto es similar a las funciones SQL UNNEST o EXPLODE de otras bases de datos.
A diferencia de la mayoría de las funciones de array, que devuelven arrays o valores escalares, arrayJoin cambia fundamentalmente el conjunto de resultados al multiplicar el número de filas.
Considere la consulta siguiente, que devuelve un array de valores de 0 a 100, de 10 en 10.
Podemos interpretar el array como distintos tiempos de retraso: 0 minutos, 10 minutos, 20 minutos, y así sucesivamente.
Podemos escribir una consulta con arrayJoin para calcular cuántos retrasos hubo de hasta ese número de minutos entre dos aeropuertos.
La siguiente consulta crea un histograma que muestra la distribución de los retrasos de vuelos de Denver (DEN) a Miami (MIA) el 1 de enero de 2024, usando buckets de retraso acumulativos:
En la consulta anterior devolvemos un array de retrasos mediante una cláusula CTE (cláusula WITH).
Destination convierte el código de destino en una cadena.
Usamos arrayJoin para expandir el array de retrasos en filas independientes.
Cada valor del array delay se convierte en su propia fila con el alias del,
y obtenemos 10 filas: una para del=0, otra para del=10, otra para del=20, etc.
Para cada umbral de retraso (del), la consulta cuenta cuántos vuelos tuvieron retrasos mayores o iguales que ese umbral
mediante countIf(DepDelayMinutes >= del).
arrayJoin también tiene un equivalente como comando SQL: ARRAY JOIN.
La consulta anterior se reproduce a continuación con el comando SQL equivalente para compararla:
Próximos pasos
groupArray, arrayFilter, arrayMap, arrayReduce y arrayJoin.
Para seguir aprendiendo, explora la referencia completa de funciones de arrays para descubrir otras funciones, como arrayFlatten, arrayReverse y arrayDistinct.
También puede interesarte aprender sobre estructuras de datos relacionadas, como los tipos tuplas, JSON y Map, que funcionan muy bien junto con los arrays.
Practica estos conceptos con tus propios conjuntos de datos y experimenta con distintas consultas en el Playground de SQL o con otros conjuntos de datos de ejemplo.
Los arrays son una característica fundamental de ClickHouse que permite realizar consultas analíticas eficientes. A medida que te familiarices más con las funciones de arrays, verás que pueden simplificar drásticamente agregaciones complejas y análisis de series temporales.
Si quieres seguir profundizando en arrays, te recomendamos el siguiente video de YouTube de Mark, nuestro experto en datos: