如何使用 chDB 查询 Apache Arrow
Apache Arrow 是一种标准化的面向列的内存格式,在数据社区中越来越受欢迎。在本指南中,我们将学习如何使用 Python
表函数查询 Apache Arrow。
设置
首先让我们创建一个虚拟环境
python -m venv .venv
source .venv/bin/activate
现在我们将安装 chDB。请确保您使用的是 2.0.2 或更高版本
pip install "chdb>=2.0.2"
现在我们将安装 pyarrow、pandas 和 ipython
pip install pyarrow pandas ipython
我们将使用 ipython
来运行本指南其余部分中的命令,您可以通过运行以下命令来启动它
ipython
您也可以在 Python 脚本或您喜欢的笔记本中使用代码。
从文件创建 Apache Arrow 表
首先,让我们下载 Ookla 数据集 的 Parquet 文件之一,使用 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 .
注意
如果要下载更多文件,请使用 aws s3 ls
获取所有文件的列表,然后更新上述命令。
接下来,我们将从 pyarrow 包中导入 Parquet 模块
import pyarrow.parquet as pq
然后我们可以将 Parquet 文件读取到 Apache Arrow 表中
arrow_table = pq.read_table("./2023-04-01_performance_mobile_tiles.parquet")
架构如下所示
arrow_table.schema
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
我们可以通过调用 shape
属性来获取行数和列数
arrow_table.shape
(3864546, 11)
查询 Apache Arrow
现在让我们从 chDB 查询 Arrow 表。首先,让我们导入 chDB
import chdb
然后我们可以描述表
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
我们还可以计算行数
chdb.query("SELECT count() FROM Python(arrow_table)", "DataFrame")
count()
0 3864546
现在,让我们做一些更有趣的事情。以下查询排除 quadkey
和 tile.*
列,然后计算所有剩余列的平均值和最大值
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")
Row 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