chDB로 Apache Arrow를 쿼리하는 방법
Apache Arrow는 데이터 커뮤니티에서 널리 사용되고 있는 표준화된 컬럼 지향 메모리 포맷입니다.
이 가이드에서는 Python table function을 사용해 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에서 실행합니다. 다음을 실행하여 시작하십시오.
Python 스크립트나 선호하는 노트북 환경에서도 코드를 사용할 수 있습니다.
파일에서 Apache Arrow 테이블 생성
먼저 AWS CLI 도구를 사용하여 Ookla 데이터셋의 Parquet 파일 중 하나를 다운로드합니다:
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")
스키마는 다음과 같습니다.
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 속성을 호출하면 행과 컬럼 개수를 알 수 있습니다:
Apache Arrow 쿼리하기
이제 chDB에서 Arrow 테이블을 쿼리해 보겠습니다.
먼저 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")
이제 조금 더 흥미로운 작업을 해 보겠습니다.
다음 쿼리는 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