> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-fbfa8bee.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# كيفية الاستعلام عن Apache Arrow باستخدام chDB

> في هذا الدليل، سنتعلم كيفية الاستعلام عن جداول Apache Arrow باستخدام chDB

يُعد [Apache Arrow](https://arrow.apache.org/) تنسيق ذاكرة معياريًا قائمًا على الأعمدة، وقد اكتسب شعبية في مجتمع البيانات.
في هذا الدليل، سنتعلم كيفية الاستعلام عن Apache Arrow باستخدام `Python` table function.

<div id="setup">
  ## الإعداد
</div>

لننشئ أولًا بيئة افتراضية:

```bash theme={null}
python -m venv .venv
source .venv/bin/activate
```

والآن سنثبّت chDB.
تأكّد من أن لديك الإصدار 2.0.2 أو إصدارًا أحدث:

```bash theme={null}
pip install "chdb>=2.0.2"
```

والآن سنثبّت PyArrow وpandas وipython:

```bash theme={null}
pip install pyarrow pandas ipython
```

سنستخدم `ipython` لتشغيل الأوامر في بقية هذا الدليل، ويمكنك تشغيله بتنفيذ:

```bash theme={null}
ipython
```

يمكنك أيضًا استخدام الشيفرة في برنامج نصي بلغة Python أو في دفترك المفضل.

<div id="creating-an-apache-arrow-table-from-a-file">
  ## إنشاء جدول Apache Arrow من ملف
</div>

لننزّل أولًا أحد ملفات Parquet من [مجموعة بيانات Ookla](https://github.com/teamookla/ookla-open-data)، باستخدام [أداة AWS CLI](https://aws.amazon.com/cli/):

```bash theme={null}
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` للحصول على قائمة بجميع الملفات، ثم حدِّث الأمر أعلاه.
</Note>

بعد ذلك، سنستورد وحدة Parquet من الحزمة `pyarrow`:

```python theme={null}
import pyarrow.parquet as pq
```

ثم يمكننا قراءة ملف Parquet في جدول Apache Arrow:

```python theme={null}
arrow_table = pq.read_table("./2023-04-01_performance_mobile_tiles.parquet")
```

يوضح مخطط البيانات أدناه:

```python theme={null}
arrow_table.schema
```

```text theme={null}
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 theme={null}
arrow_table.shape
```

```text theme={null}
(3864546, 11)
```

<div id="querying-apache-arrow">
  ## الاستعلام عن Apache Arrow
</div>

الآن، لنُجري استعلامًا على جدول Arrow باستخدام chDB.
أولًا، لنستورد chDB:

```python theme={null}
import chdb
```

بعد ذلك، يمكننا وصف الجدول:

```python theme={null}
chdb.query("""
DESCRIBE Python(arrow_table)
SETTINGS describe_compact_output=1
""", "DataFrame")
```

```text theme={null}
               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 theme={null}
chdb.query("SELECT count() FROM Python(arrow_table)", "DataFrame")
```

```text theme={null}
   count()
0  3864546
```

والآن، لنفعل شيئًا أكثر إثارةً للاهتمام قليلًا.
يستبعد الاستعلام التالي العمودين `quadkey` و`tile.*`، ثم يحسب المتوسط والحد الأقصى للقيم في جميع الأعمدة المتبقية:

```python theme={null}
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 theme={null}
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
```
