Apache Arrow é um formato de memória padronizado e orientado a colunas que ganhou popularidade na comunidade de dados.
Neste guia, aprenderemos como consultar o Apache Arrow usando a função de tabela Python.
Vamos criar primeiro um ambiente virtual:
python -m venv .venv
source .venv/bin/activate
E agora vamos instalar o chDB.
Certifique-se de ter a versão 2.0.2 ou superior:
pip install "chdb>=2.0.2"
Agora, vamos instalar PyArrow, pandas e ipython:
pip install pyarrow pandas ipython
Vamos usar o ipython para executar os comandos no restante do guia, que pode ser iniciado com:
Você também pode usar o código em um script Python ou no notebook de sua preferência.
Criando uma tabela Apache Arrow a partir de um arquivo
Primeiro, vamos baixar um dos arquivos Parquet do conjunto de dados Ookla usando a AWS CLI:
aws s3 cp \
--no-sign \
s3://ookla-open-data/parquet/performance/type=mobile/year=2023/quarter=2/2023-04-01_performance_mobile_tiles.parquet .
Se quiser baixar mais arquivos, use aws s3 ls para obter uma lista de todos eles e, em seguida, atualizar o comando acima.
Em seguida, vamos importar o módulo Parquet do pacote pyarrow:
import pyarrow.parquet as pq
E então podemos ler o arquivo Parquet em uma tabela do Apache Arrow:
arrow_table = pq.read_table("./2023-04-01_performance_mobile_tiles.parquet")
O esquema é exibido abaixo:
quadkey: string
tile: string
tile_x: double
tile_y: double
avg_d_kbps: int64
avg_u_kbps: int64
avg_lat_ms: int64
avg_lat_down_ms: int32
avg_lat_up_ms: int32
tests: int64
devices: int64
E podemos obter o número de linhas e colunas chamando o atributo shape:
Consultando o Apache Arrow
Agora vamos consultar a tabela do Arrow no chDB.
Primeiro, vamos importar o chDB:
Em seguida, podemos descrever a tabela:
chdb.query("""
DESCRIBE Python(arrow_table)
SETTINGS describe_compact_output=1
""", "DataFrame")
name type
0 quadkey String
1 tile String
2 tile_x Float64
3 tile_y Float64
4 avg_d_kbps Int64
5 avg_u_kbps Int64
6 avg_lat_ms Int64
7 avg_lat_down_ms Int32
8 avg_lat_up_ms Int32
9 tests Int64
10 devices Int64
Também podemos contar o número de linhas:
chdb.query("SELECT count() FROM Python(arrow_table)", "DataFrame")
Agora, vamos fazer algo um pouco mais interessante.
A consulta a seguir exclui as colunas quadkey e tile.* e, em seguida, calcula os valores médio e máximo de todas as colunas restantes:
chdb.query("""
WITH numericColumns AS (
SELECT * EXCEPT ('tile.*') EXCEPT(quadkey)
FROM Python(arrow_table)
)
SELECT * APPLY(max), * APPLY(avg) APPLY(x -> round(x, 2))
FROM numericColumns
""", "Vertical")
Linha 1:
──────
max(avg_d_kbps): 4155282
max(avg_u_kbps): 1036628
max(avg_lat_ms): 2911
max(avg_lat_down_ms): 2146959360
max(avg_lat_up_ms): 2146959360
max(tests): 111266
max(devices): 1226
round(avg(avg_d_kbps), 2): 84393.52
round(avg(avg_u_kbps), 2): 15540.4
round(avg(avg_lat_ms), 2): 41.25
round(avg(avg_lat_down_ms), 2): 554355225.76
round(avg(avg_lat_up_ms), 2): 552843178.3
round(avg(tests), 2): 6.31
round(avg(devices), 2): 2.88