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

4.4 KiB
Raw Blame History

title sidebar_label slug description keywords
chDBでApache Arrowをクエリする方法 Apache Arrowをクエリする /ja/chdb/guides/apache-arrow このガイドでは、chDBを使用してApache Arrowテーブルをクエリする方法を学びます。
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テーブルを作成する

まず、AWS CLIツールを使用して、OoklaデータセットのParquetファイルの1つをダウンロードします

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モジュールをインポートします

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