Neste guia, você aprenderá a usar arrays no ClickHouse e algumas das funções de array mais usadas.
Introdução aos arrays
array:
[]:
Criando arrays de tipos diferentes
Criando arrays de tipos diferentes
Você pode usar a configuração Depois, você também pode ler os tipos do array pelo nome do tipo:
use_variant_as_common_type para alterar o comportamento padrão descrito acima.
Isso permite usar o tipo Variant como tipo de resultado para as funções if/multiIf/array/map quando não há um tipo comum entre os tipos dos argumentos.Por exemplo:[] é uma forma conveniente de acessar elementos de um array.
No ClickHouse, é importante saber que o índice do array sempre começa em 1.
Isso pode ser diferente de outras linguagens de programação com as quais você está acostumado, nas quais os arrays são indexados a partir de zero.
Por exemplo, dado um array, você pode selecionar o primeiro elemento dele escrevendo:
Funções de array
funções length, arrayEnumerate, indexOf e has*
length é usada para retornar o número de elementos no array:
arrayEnumerate para retornar um array com os índices dos elementos:
indexOf:
indexOfAssumeSorted.
As funções has, hasAll e hasAny são úteis para determinar se um array contém um determinado valor.
Considere o exemplo a seguir:
Explorando dados de voos com funções de array
groupArray
groupArray, que recebe os valores da coluna especificada de cada linha e os agrupa em um array.
Execute a consulta abaixo para ver como ela funciona:
O toStringCutToZero na consulta acima é usado para remover caracteres nulos que aparecem após o código de 3 letras de alguns aeroportos.
Com os dados nesse formato, podemos encontrar facilmente a ordem dos aeroportos mais movimentados calculando o comprimento dos arrays “Destinations” agrupados:
arrayMap e arrayZip
arrayMap é um exemplo desse tipo de função de ordem superior e retorna um novo array a partir do array fornecido, aplicando uma função lambda a cada elemento do array original.
Execute a consulta abaixo, que usa a função arrayMap, para ver quais voos tiveram atraso ou saíram no horário.
Para pares de origem/destino, ela mostra o número de cauda e o status de cada voo:
Na consulta acima, a função arrayMap recebe um array de um único elemento [DepDelayMinutes] e aplica a função lambda d -> if(d >= 30, 'DELAYED', if(d >= 15, 'WARNING', 'ON-TIME' para categorizá-lo.
Em seguida, o primeiro elemento do array resultante é extraído com [DepDelayMinutes][1].
A função arrayZip combina o array Tail_Number e o array statuses em um único array.
arrayFilter
DEN, ATL e DFW:
Na consulta acima, passamos uma função lambda como primeiro argumento para a função arrayFilter.
Essa função lambda recebe o atraso em minutos (d) e retorna 1 se a condição for atendida; caso contrário, 0.
arraySort e arrayIntersect
arraySort e arrayIntersect.
arraySort recebe um array e ordena os elementos em ordem crescente por padrão, embora você também possa passar uma função lambda para definir a ordem de ordenação.
arrayIntersect recebe vários arrays e retorna um array com os elementos presentes em todos eles.
Execute a consulta abaixo para ver essas duas funções de array em ação:
A consulta funciona em duas etapas principais.
Primeiro, ela cria um conjunto de dados temporário chamado airport_routes usando uma Common Table Expression (CTE), analisando todos os voos de 1º de janeiro de 2024 e, para cada aeroporto de origem, montando uma lista ordenada de todos os destinos únicos atendidos por esse aeroporto.
No conjunto de resultados airport_routes, por exemplo, DEN pode ter um array com todas as cidades para as quais há voos, como ['ATL', 'BOS', 'LAX', 'MIA', ...], e assim por diante.
Na segunda etapa, a consulta pega cinco grandes hubs dos EUA (DEN, ATL, DFW, ORD e LAS) e compara todos os pares possíveis entre eles.
Isso é feito com um cross join, que cria todas as combinações desses aeroportos.
Em seguida, para cada par, ela usa a função arrayIntersect para encontrar quais destinos aparecem nas listas de ambos os aeroportos.
A função length conta quantos destinos eles têm em comum.
A condição a1.Origin < a2.Origin garante que cada par apareça apenas uma vez.
Sem isso, você obteria tanto JFK-LAX quanto LAX-JFK como resultados separados, o que seria redundante, já que representam a mesma comparação.
Por fim, a consulta ordena os resultados para mostrar quais pares de aeroportos têm o maior número de destinos em comum e retorna apenas os 10 primeiros.
Isso revela quais grandes hubs têm as redes de rotas mais sobrepostas, o que pode indicar mercados competitivos em que várias companhias aéreas atendem aos mesmos pares de cidades, ou hubs que atendem regiões geográficas semelhantes e que poderiam ser usados como pontos alternativos de conexão para viajantes.
arrayReduce
arrayReduce, para encontrar o atraso médio e o atraso máximo
de cada rota que parte do Aeroporto Internacional de Denver:
No exemplo acima, usamos arrayReduce para encontrar os atrasos médio e máximo de vários voos que partem de DEN.
arrayReduce aplica uma função agregada, especificada no primeiro parâmetro da função, aos elementos do array fornecido, especificado no segundo parâmetro da função.
arrayJoin
arrayJoin.
arrayJoin “explode” um array, criando uma linha separada para cada elemento.
Isso é semelhante às funções SQL UNNEST ou EXPLODE em outros bancos de dados.
Ao contrário da maioria das funções de array, que retornam arrays ou valores escalares, arrayJoin altera fundamentalmente o conjunto de resultados ao multiplicar o número de linhas.
Considere a consulta abaixo, que retorna um array de valores de 0 a 100 em passos de 10.
Podemos considerar esse array como diferentes tempos de atraso: 0 minutos, 10 minutos, 20 minutos e assim por diante.
Podemos escrever uma consulta usando arrayJoin para descobrir quantos atrasos houve até cada um desses tempos, entre dois aeroportos.
A consulta abaixo cria um histograma mostrando a distribuição dos atrasos de voos de Denver (DEN) para Miami (MIA) em 1º de janeiro de 2024, usando buckets cumulativos de atraso:
Na consulta acima, retornamos um array de atrasos usando uma cláusula CTE (cláusula WITH).
Destination converte o código de destino em string.
Usamos arrayJoin para explodir o array de atrasos em linhas separadas.
Cada valor do array delay se torna sua própria linha com o alias del,
e obtemos 10 linhas: uma para del=0, uma para del=10, uma para del=20 etc.
Para cada limite de atraso (del), a consulta conta quantos voos tiveram atrasos maiores ou iguais a esse limite
usando countIf(DepDelayMinutes >= del).
arrayJoin também tem um equivalente como comando SQL: ARRAY JOIN.
A consulta acima é reproduzida abaixo com o comando SQL equivalente para comparação:
Próximos passos
groupArray, arrayFilter, arrayMap, arrayReduce e arrayJoin.
Para continuar sua jornada de aprendizado, explore a referência completa de funções de array para descobrir outras funções, como arrayFlatten, arrayReverse e arrayDistinct.
Você também pode querer aprender sobre estruturas de dados relacionadas, como os tipos tupla, JSON e Map, que funcionam bem em conjunto com arrays.
Pratique a aplicação desses conceitos aos seus próprios conjuntos de dados e experimente diferentes consultas no playground SQL ou em outros conjuntos de dados de exemplo.
Arrays são um recurso fundamental no ClickHouse, permitindo consultas analíticas eficientes — à medida que você se sentir mais à vontade com as funções de array, verá que elas podem simplificar drasticamente agregações complexas e análises de séries temporais.
Para se aprofundar ainda mais em arrays, recomendamos o vídeo do YouTube abaixo com Mark, nosso especialista residente em dados: