ClickHouse/docs/ja/chdb/guides/querying-apache-arrow.md
2024-11-18 11:58:58 +09:00

170 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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
```