يُعد 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 .بعد ذلك، سنستورد وحدة Parquet من الحزمة pyarrow:
import pyarrow.parquet as pqثم يمكننا قراءة ملف Parquet في جدول Apache Arrow:
arrow_table = pq.read_table("./2023-04-01_performance_mobile_tiles.parquet")يوضح مخطط البيانات أدناه:
arrow_table.schemaquadkey: 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