الانتقال إلى المحتوى الرئيسي
يُعد Apache Arrow تنسيق ذاكرة معياريًا قائمًا على الأعمدة، وقد اكتسب شعبية في مجتمع البيانات. في هذا الدليل، سنتعلم كيفية الاستعلام عن Apache Arrow باستخدام Python table function.

الإعداد

لننشئ أولًا بيئة افتراضية:
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 من ملف

لننزّل أولًا أحد ملفات Parquet من مجموعة بيانات Ookla، باستخدام أداة AWS CLI:
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 للحصول على قائمة بجميع الملفات، ثم حدِّث الأمر أعلاه.
بعد ذلك، سنستورد وحدة Parquet من الحزمة pyarrow:
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

الآن، لنُجري استعلامًا على جدول Arrow باستخدام chDB. أولًا، لنستورد 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
آخر تعديل في ٢٩ يونيو ٢٠٢٦