يُعد 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 لتشغيل الأوامر في بقية هذا الدليل، ويمكنك تشغيله بتنفيذ:
يمكنك أيضًا استخدام الشيفرة في برنامج نصي بلغة 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")
يوضح مخطط البيانات أدناه:
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:
الاستعلام عن Apache Arrow
الآن، لنُجري استعلامًا على جدول Arrow باستخدام chDB.
أولًا، لنستورد 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")
والآن، لنفعل شيئًا أكثر إثارةً للاهتمام قليلًا.
يستبعد الاستعلام التالي العمودين 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