ستتعلّم في هذا الدليل كيفية استخدام المصفوفات في ClickHouse، إلى جانب بعض دوال المصفوفات الأكثر شيوعًا.
مقدمة إلى المصفوفات
array:
[]:
إنشاء مصفوفات من أنواع مختلفة
إنشاء مصفوفات من أنواع مختلفة
يمكنك استخدام الإعداد بعد ذلك، يمكنك أيضًا الوصول إلى القيم في المصفوفة حسب اسم النوع:
use_variant_as_common_type لتغيير السلوك الافتراضي الموضّح أعلاه.
يتيح لك ذلك استخدام النوع Variant كنوع ناتج لدوال if/multiIf/array/map عندما لا يوجد نوع مشترك لأنواع الوسيطات.على سبيل المثال:[] طريقة ملائمة للوصول إلى عناصر المصفوفة.
في ClickHouse، من المهم معرفة أن فهرس المصفوفة يبدأ دائمًا من 1.
قد يختلف ذلك عن لغات البرمجة الأخرى التي اعتدت عليها، حيث تبدأ فهرسة المصفوفات من الصفر.
على سبيل المثال، إذا كانت لديك مصفوفة، فيمكنك اختيار العنصر الأول منها بكتابة ما يلي:
دوال المصفوفات
دوال length وarrayEnumerate وindexOf وhas*
length لإرجاع عدد العناصر في Array:
arrayEnumerate لإرجاع مصفوفة تضم فهارس العناصر:
indexOf:
indexOfAssumeSorted.
تُعد الدوال has وhasAll وhasAny مفيدة لتحديد ما إذا كانت المصفوفة تحتوي على قيمة معيّنة.
تأمل المثال التالي:
استكشاف بيانات الرحلات باستخدام دوال المصفوفات
groupArray
groupArray، التي تأخذ قيم العمود المحدد من كل صف وتجمعها في Array.
شغّل الاستعلام أدناه لترى كيف يعمل ذلك:
تُستخدم toStringCutToZero في الاستعلام أعلاه لإزالة محارف NULL التي تظهر بعد الرمز المكوّن من ثلاثة أحرف لبعض المطارات.
بهذا التنسيق للبيانات، يمكننا بسهولة معرفة ترتيب أكثر المطارات ازدحامًا من خلال إيجاد طول Arrays “Destinations” المجمّعة:
arrayMap و arrayZip
arrayMap مثالًا على هذا النوع من الدوال عالية الرتبة، إذ تُرجع مصفوفة جديدة من المصفوفة المُدخلة عبر تطبيق دالة لامبدا على كل عنصر من عناصر المصفوفة الأصلية.
شغّل الاستعلام أدناه، الذي يستخدم الدالة arrayMap لمعرفة الرحلات التي تأخرت وتلك التي غادرت في الوقت المحدد.
وبالنسبة إلى أزواج المصدر/الوجهة، فإنه يعرض رقم الذيل والحالة لكل رحلة:
في الاستعلام أعلاه، تأخذ الدالة arrayMap مصفوفة أحادية العنصر [DepDelayMinutes] وتطبّق دالة لامبدا d -> if(d >= 30, 'DELAYED', if(d >= 15, 'WARNING', 'ON-TIME' لتصنيفها.
ثم يُستخرج العنصر الأول من المصفوفة الناتجة باستخدام [DepDelayMinutes][1].
وتجمع الدالة arrayZip بين مصفوفة Tail_Number ومصفوفة statuses في مصفوفة واحدة.
arrayFilter
DEN وATL وDFW:
في query أعلاه، نمرّر دالة لامبدا بوصفها argument الأول إلى الدالة arrayFilter.
وتأخذ دالة لامبدا هذه قيمة التأخير بالدقائق (d)، وتُرجع 1 إذا تحقق الشرط، وإلا فتُرجع 0.
arraySort و arrayIntersect
arraySort وarrayIntersect.
تأخذ arraySort مصفوفة وتفرز عناصرها بترتيب تصاعدي افتراضيًا، كما يمكنك أيضًا تمرير دالة لامبدا إليها لتحديد ترتيب الفرز.
وتأخذ arrayIntersect عدة مصفوفات وتُرجع مصفوفة تضم العناصر الموجودة في جميع المصفوفات.
شغّل الاستعلام أدناه لرؤية دالتي المصفوفات هاتين أثناء التنفيذ:
يعمل هذا الاستعلام على مرحلتين رئيسيتين.
في المرحلة الأولى، ينشئ مجموعة بيانات مؤقتة باسم airport_routes باستخدام تعبير جدول مشترك (CTE)، إذ ينظر إلى جميع الرحلات في 1 يناير 2024، وينشئ لكل مطار انطلاق قائمة مرتبة بكل وجهة فريدة يخدمها ذلك المطار.
في مجموعة النتائج airport_routes، على سبيل المثال، قد تكون لدى DEN مصفوفة تحتوي على جميع المدن التي تسير إليها رحلاته، مثل ['ATL', 'BOS', 'LAX', 'MIA', ...] وهكذا.
في المرحلة الثانية، يأخذ الاستعلام خمسة مطارات محورية أمريكية كبرى (DEN وATL وDFW وORD وLAS) ويقارن كل زوج ممكن منها.
ويفعل ذلك باستخدام CROSS JOIN، الذي ينشئ جميع التركيبات الممكنة لهذه المطارات.
ثم يستخدم، لكل زوج، الدالة arrayIntersect للعثور على الوجهات التي تظهر في قائمتي المطارين معًا.
وتحسب الدالة length عدد الوجهات المشتركة بينهما.
ويضمن الشرط a1.Origin < a2.Origin أن يظهر كل زوج مرة واحدة فقط.
ومن دون ذلك، ستحصل على كلٍّ من JFK-LAX وLAX-JFK كنتيجتين منفصلتين، وهذا سيكون تكرارًا لأنهما يمثلان المقارنة نفسها.
وأخيرًا، يفرز الاستعلام النتائج لإظهار أزواج المطارات التي لديها أكبر عدد من الوجهات المشتركة، ثم يعرض أفضل 10 فقط.
ويكشف ذلك عن المطارات المحورية الكبرى التي لديها أكبر قدر من التداخل في شبكات المسارات، وهو ما قد يشير إلى أسواق تنافسية تخدم فيها عدة شركات طيران أزواج المدن نفسها، أو إلى مطارات محورية تخدم مناطق جغرافية متشابهة ويمكن استخدامها كنقاط ربط بديلة للمسافرين.
arrayReduce
arrayReduce، لإيجاد متوسط التأخير وأقصى تأخير
لكل مسار انطلاقًا من مطار دنفر الدولي:
في المثال أعلاه، استخدمنا arrayReduce لإيجاد متوسط التأخير وأقصى تأخير لمختلف الرحلات المغادرة من DEN.
تُطبّق arrayReduce دالة تجميع، تُحدَّد في المعلَمة الأولى للدالة، على عناصر المصفوفة المُمرَّرة إليها والمحددة في المعلَمة الثانية.
arrayJoin
arrayJoin.
تقوم arrayJoin “بتفجير” المصفوفة، إذ تأخذها وتُنشئ صفاً منفصلاً لكل عنصر.
وهذا يشبه دالتي SQL UNNEST وEXPLODE في قواعد البيانات الأخرى.
وعلى خلاف معظم دوال المصفوفات التي تُرجع مصفوفات أو قيماً مفردة، فإن arrayJoin تغيّر مجموعة النتائج جذرياً عبر مضاعفة عدد الصفوف.
تأمّل الاستعلام أدناه، الذي يُرجع مصفوفة من القيم من 0 إلى 100 بخطوات مقدارها 10.
ويمكننا اعتبار هذه المصفوفة أزمنة تأخير مختلفة: 0 دقيقة، و10 دقائق، و20 دقيقة، وهكذا.
يمكننا كتابة استعلام باستخدام arrayJoin لمعرفة عدد حالات التأخير حتى ذلك العدد من الدقائق بين مطارين.
ينشئ الاستعلام أدناه مدرجاً تكرارياً يوضّح توزيع تأخيرات الرحلات من Denver (DEN) إلى Miami (MIA) في 1 يناير 2024، باستخدام سلال تأخير تراكمية:
في الاستعلام أعلاه، نُرجع مصفوفة من قيم التأخير باستخدام عبارة CTE (عبارة WITH).
ويحوّل Destination رمز الوجهة إلى سلسلة نصية.
نستخدم arrayJoin لتفجير مصفوفة التأخير إلى صفوف منفصلة.
وتصبح كل قيمة في مصفوفة delay صفاً مستقلاً يحمل الاسم المستعار del,
ونحصل على 10 صفوف: صف لـ del=0، وصف لـ del=10، وصف لـ del=20، وهكذا.
ولكل عتبة تأخير (del)، يحسب الاستعلام عدد الرحلات التي كان تأخيرها أكبر من تلك العتبة أو مساوياً لها
باستخدام countIf(DepDelayMinutes >= del).
لدى arrayJoin أيضاً مكافئ بصيغة أمر SQL، وهو ARRAY JOIN.
وقد أُعيد عرض الاستعلام أعلاه أدناه باستخدام أمر SQL المكافئ لأغراض المقارنة:
الخطوات التالية
groupArray وarrayFilter وarrayMap وarrayReduce وarrayJoin.
ولمتابعة رحلة التعلّم، اطّلع على المرجع الكامل لدوال المصفوفات لاكتشاف وظائف إضافية مثل arrayFlatten وarrayReverse وarrayDistinct.
قد ترغب أيضًا في التعرّف على هياكل بيانات ذات صلة مثل أنواع tuples وJSON وMap، التي تعمل بكفاءة إلى جانب المصفوفات.
تدرّب على تطبيق هذه المفاهيم على مجموعات بياناتك الخاصة، وجرّب استعلامات مختلفة في SQL playground أو على مجموعات بيانات تجريبية أخرى.
تُعدّ المصفوفات ميزة أساسية في ClickHouse تتيح تنفيذ استعلامات تحليلية بكفاءة. وكلما أصبحت أكثر إلمامًا بوظائف المصفوفات، ستجد أنها قادرة على تبسيط عمليات التجميع المعقّدة وتحليل السلاسل الزمنية بشكل كبير.
ولمزيد من المتعة مع المصفوفات، نوصي بمشاهدة فيديو YouTube أدناه من Mark، خبير البيانات المقيم لدينا: