mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-14 10:22:10 +00:00
170 lines
4.4 KiB
Markdown
170 lines
4.4 KiB
Markdown
---
|
||
title: chDBでApache Arrowをクエリする方法
|
||
sidebar_label: Apache Arrowをクエリする
|
||
slug: /ja/chdb/guides/apache-arrow
|
||
description: このガイドでは、chDBを使用してApache Arrowテーブルをクエリする方法を学びます。
|
||
keywords: [chdb, apache-arrow]
|
||
---
|
||
|
||
[Apache Arrow](https://arrow.apache.org/) は、データコミュニティで人気を博している標準化された列指向メモリフォーマットです。このガイドでは、`Python`テーブル関数を使用してApache Arrowをクエリする方法を学びます。
|
||
|
||
## セットアップ
|
||
|
||
まず、仮想環境を作成します:
|
||
|
||
```bash
|
||
python -m venv .venv
|
||
source .venv/bin/activate
|
||
```
|
||
|
||
次に、chDBをインストールします。バージョン2.0.2以上であることを確認してください:
|
||
|
||
```bash
|
||
pip install "chdb>=2.0.2"
|
||
```
|
||
|
||
次に、pyarrow、pandas、ipythonをインストールします:
|
||
|
||
```bash
|
||
pip install pyarrow pandas ipython
|
||
```
|
||
|
||
この後のガイドで使用するコマンドを実行するために、`ipython`を使用します。起動するには以下を実行してください:
|
||
|
||
```bash
|
||
ipython
|
||
```
|
||
|
||
また、Pythonスクリプトや好きなノートブックでもコードを使用できます。
|
||
|
||
## ファイルからApache Arrowテーブルを作成する
|
||
|
||
まず、[AWS CLIツール](https://aws.amazon.com/cli/)を使用して、[Ooklaデータセット](https://github.com/teamookla/ookla-open-data)のParquetファイルの1つをダウンロードします:
|
||
|
||
```bash
|
||
aws s3 cp \
|
||
--no-sign \
|
||
s3://ookla-open-data/parquet/performance/type=mobile/year=2023/quarter=2/2023-04-01_performance_mobile_tiles.parquet .
|
||
```
|
||
|
||
:::note
|
||
ファイルをもっとダウンロードしたい場合は、`aws s3 ls`を使ってすべてのファイルのリストを取得し、上記のコマンドを更新してください。
|
||
:::
|
||
|
||
次に、pyarrowパッケージからParquetモジュールをインポートします:
|
||
|
||
```python
|
||
import pyarrow.parquet as pq
|
||
```
|
||
|
||
そして、ParquetファイルをApache Arrowテーブルに読み込むことができます:
|
||
|
||
```python
|
||
arrow_table = pq.read_table("./2023-04-01_performance_mobile_tiles.parquet")
|
||
```
|
||
|
||
スキーマは以下の通りです:
|
||
|
||
```python
|
||
arrow_table.schema
|
||
```
|
||
|
||
```text
|
||
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`属性を呼び出すことで行とカラムの数を取得できます:
|
||
|
||
```python
|
||
arrow_table.shape
|
||
```
|
||
|
||
```text
|
||
(3864546, 11)
|
||
```
|
||
|
||
## Apache Arrowをクエリする
|
||
|
||
次に、chDBからArrowテーブルをクエリしましょう。まず、chDBをインポートします:
|
||
|
||
```python
|
||
import chdb
|
||
```
|
||
|
||
そして、テーブルを記述します:
|
||
|
||
```python
|
||
chdb.query("""
|
||
DESCRIBE Python(arrow_table)
|
||
SETTINGS describe_compact_output=1
|
||
""", "DataFrame")
|
||
```
|
||
|
||
```text
|
||
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
|
||
```
|
||
|
||
行の数もカウントできます:
|
||
|
||
```python
|
||
chdb.query("SELECT count() FROM Python(arrow_table)", "DataFrame")
|
||
```
|
||
|
||
```text
|
||
count()
|
||
0 3864546
|
||
```
|
||
|
||
では、もう少し興味深いことをしましょう。以下のクエリは、`quadkey`および`tile.*`カラムを除外し、残りのすべてのカラムの平均と最大値を計算します:
|
||
|
||
```python
|
||
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")
|
||
```
|
||
|
||
```text
|
||
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
|
||
```
|