JupySQL هي مكتبة Python تتيح لك تشغيل SQL في دفاتر Jupyter وواجهة IPython.
في هذا الدليل، سنتعلّم كيفية الاستعلام عن البيانات باستخدام chDB وJupySQL.
لنبدأ أولًا بإنشاء بيئة افتراضية:
ثم سنقوم بتثبيت JupySQL وIPython وJupyter Lab:
يمكننا استخدام JupySQL في IPython، ويمكننا تشغيله بتنفيذ:
أو في Jupyter Lab، عبر تشغيل:
إذا كنت تستخدم Jupyter Lab، فستحتاج إلى إنشاء دفتر قبل متابعة بقية الدليل.
سنستخدم إحدى مجموعات بيانات tennis_atp الخاصة بـ Jeff Sackmann، والتي تتضمن بيانات وصفية عن اللاعبين وتصنيفاتهم بمرور الوقت.
لنبدأ بتنزيل ملفات التصنيف:
بعد ذلك، لنستورد الوحدة dbapi الخاصة بـ chDB:
وسننشىء اتصالًا بـ chDB.
ستُحفَظ أي بيانات نُخزّنها بشكل دائم في المجلد atp.chdb:
لنحمّل الآن الأمر السحري sql وننشئ اتصالًا بـ chDB:
بعد ذلك، سنعرض حدّ العرض كي لا تُقتطع نتائج الاستعلامات:
## الاستعلام عن البيانات في ملفات CSV
نزّلنا مجموعة من الملفات ذات البادئة atp_rankings.
لنستخدم عبارة DESCRIBE لفهم المخطط:
يمكننا أيضًا كتابة استعلام SELECT مباشرةً على هذه الملفات لمعرفة شكل البيانات:
تنسيق البيانات غريب بعض الشيء.
لنصحّح تنسيق ذلك التاريخ ونستخدم عبارة REPLACE لإرجاع ranking_date بعد تصحيحه:
استيراد ملفات CSV إلى chDB
سنخزّن الآن البيانات من ملفات CSV هذه في جدول.
لا تحفظ قاعدة البيانات الافتراضية البيانات على القرص، لذا نحتاج أولًا إلى إنشاء قاعدة بيانات أخرى:
والآن سننشئ جدولًا باسم rankings، وسيُستمد مخططه من بنية البيانات في ملفات CSV:
لنتحقق سريعًا من البيانات في جدولنا:
يبدو هذا جيدًا - فالنتيجة، كما هو متوقع، هي نفسها عند الاستعلام من ملفات CSV مباشرةً.
سنتبع العملية نفسها مع البيانات الوصفية للاعب.
هذه المرة، توجد جميع البيانات في ملف CSV واحد، لذا لننزّل هذا الملف:
ثم أنشئ جدولًا باسم players استنادًا إلى محتويات ملف CSV.
وسنُهيِّئ أيضًا الحقل dob ليصبح من النوع Date32.
في ClickHouse، لا يدعم النوع Date إلا التواريخ بدءًا من عام 1970. وبما أن العمود dob يحتوي على تواريخ تسبق عام 1970، فسنستخدم النوع Date32 بدلًا منه.
بعد اكتمال التشغيل، يمكننا إلقاء نظرة على البيانات التي استوردناها:
اكتملت عملية إدخال البيانات، والآن حان وقت الجزء الممتع: الاستعلام عن البيانات!
يحصل لاعبو التنس على نقاط بناءً على مستوى أدائهم في البطولات التي يشاركون فيها.
تُحتسب نقاط كل لاعب على أساس فترة متحركة تمتد 52 أسبوعًا.
سنكتب استعلامًا يعثر على الحد الأقصى للنقاط التي جمعها كل لاعب، إلى جانب ترتيبه في ذلك الوقت:
من المثير للاهتمام حقًا أن بعض اللاعبين في هذه القائمة جمعوا عددًا كبيرًا من النقاط من دون أن يحتلوا المركز الأول بهذا الرصيد من النقاط.
يمكن حفظ الاستعلامات باستخدام المعلَمة --save في السطر نفسه الذي يظهر فيه الأمر السحري %%sql.
وتعني المعلَمة --no-execute أنه سيتم تخطي تنفيذ الاستعلام.
عند تشغيل استعلام محفوظ، سيُحوَّل إلى تعبير جدول مشترك (CTE) قبل تنفيذه.
في الاستعلام التالي، نحسب الحد الأقصى للنقاط التي حققها اللاعبون حين كانوا في المركز الأول:
الاستعلام باستخدام المعلمات
يمكننا أيضًا استخدام المعلمات في استعلاماتنا.
المعلمات ليست سوى متغيرات عادية:
وبعد ذلك، يمكننا استخدام صيغة {{variable}} في الاستعلام.
يعثر الاستعلام التالي على اللاعبين الذين كانت لديهم أقل مدة، محسوبة بالأيام، بين أول مرة دخلوا فيها ضمن أفضل 10 وآخر مرة دخلوا فيها ضمن أفضل 10:
يوفّر JupySQL أيضًا إمكانات محدودة لرسم المخططات.
يمكننا إنشاء مخططات صندوقية أو مدرجات تكرارية.
سننشئ مدرجًا تكراريًا، ولكن دعونا أولًا نكتب (ونحفظ) استعلامًا يحسب المراكز ضمن أفضل 100 التي حققها كل لاعب.
وسيكون بإمكاننا استخدامه لإنشاء مدرج تكراري يحصي عدد اللاعبين الذين حققوا كل مركز:
يمكننا بعد ذلك إنشاء مدرج تكراري بتنفيذ ما يلي: