أمثلة على استعلامات Hive: الترتيب حسب، التجميع حسب و Cluster By

⚡ ملخص ذكي

تستخدم استعلامات Hive عبارات ORDER BY و GROUP BY و SORT BY و CLUSTER BY و DISTRIBUTE BY لفرز وتجميع وتوزيع الصفوف عبر المخفضات، ويتم توضيح كل عبارة هنا على جدول موظفين واحد كمثال.

  • 🧱 جدول العينة أولاً: يتم إنشاء جدول employees_guru بستة أعمدة ويتم تحميله من ملف Employees.txt قبل تشغيل أي شرط.
  • 🔢 ترتيب النتائج حسب الإجمالي: تقوم عبارة ORDER BY بإرسال مجموعة النتائج بأكملها إلى مُختزل واحد، مما يضمن الترتيب الكامل ولكنه يبطئ الاستعلامات الكبيرة.
  • 🔤 فرز السلاسل النصية: يتم إرجاع عمود السلسلة مثل Department بالترتيب المعجمي بدلاً من الترتيب العددي.
  • 📊 GROUP BY counts: يؤدي استخدام GROUP BY مع count(*) إلى إرجاع صف واحد لكل قسم مع إجمالي عدد موظفيه.
  • 🔀 يتم الفرز حسب كل مُخفِّض: تقوم وظيفة SORT BY بترتيب الصفوف داخل كل وحدة اختزال، لذا فإن وحدات الاختزال المتعددة تنتج مخرجات مرتبة جزئيًا.
  • 🎯 يجمع CLUSTER BY ما يلي: يعمل CLUSTER BY كـ DISTRIBUTE BY بالإضافة إلى SORT BY، بينما يقوم DISTRIBUTE BY وحده بتوجيه المفاتيح المطابقة إلى مُخفِّض واحد غير مُرتَّب.

استعلامات Hive: ترتيب حسب، تجميع حسب، Cluster بواسطة وتوزيع

يوفر Hive لغة استعلام من نوع SQL لأغراض ETL بالإضافة إلى Hadoop نظام الملفات.

توفر لغة استعلام Hive (HiveQL) بيئة من نوع SQL في Hive للعمل مع الجداول وقواعد البيانات والاستعلامات.

ترتبط أنواع مختلفة من البنود بـ Hive لتنفيذ أنواع مختلفة من معالجة البيانات والاستعلام عنها، ويوفر Hive اتصال JDBC لتحسين الاتصالات مع العقد خارج البيئة.

توفر استعلامات Hive الميزات التالية:

  • نمذجة البيانات مثل إنشاء قواعد البيانات والجداول وما إلى ذلك.
  • وظائف ETL مثل extracمعالجة البيانات وتحويلها وتحميلها في جداول
  • ينضم لدمج جداول البيانات المختلفة
  • برامج نصية مخصصة خاصة بالمستخدم لسهولة التعليمات البرمجية
  • أداة استعلام أسرع على رأس Hadoop

إنشاء جدول في الخلية

قبل البدء بالموضوع الرئيسي لهذا الدرس التعليمي، سنقوم أولاً بإنشاء جدول لاستخدامه كمرجع للأقسام اللاحقة.

في هذا البرنامج التعليمي، سنقوم بإنشاء جدول "employees_guru" بستة أعمدة، كما هو موضح في لقطة الشاشة أدناه.

عبارة إنشاء جدول في Hive باسم employees_guru وأمر التحميل

من لقطة الشاشة أعلاه،

  1. نقوم بإنشاء جدول "employees_guru" بستة أعمدة تحتوي على قيم مثل المعرف والاسم والعمر والعنوان والراتب والقسم، والتي تنتمي إلى الموظفين الموجودين في المؤسسة "guru".
  2. في هذه الخطوة، نقوم بتحميل البيانات إلى جدول employees_guru. البيانات التي سنقوم بتحميلها موجودة في ملف Employees.txt.

الترتيب حسب الاستعلام

تتشابه صيغة ORDER BY في HiveQL مع صيغة ORDER BY في SQL لغة.

عبارة ORDER BY هي العبارة التي نستخدمها مع عبارة "SELECT" في استعلامات الخلية لفرز البيانات. يستخدم أعمدة في جداول Hive لفرز قيم الأعمدة المحددة المذكورة باستخدام ORDER BY، ويعرض الاستعلام النتائج بترتيب تصاعدي أو تنازلي لتلك القيم.

إذا كان حقل ORDER BY المذكور عبارة عن سلسلة نصية، فسيتم عرض النتيجة بترتيب أبجدي. في الواجهة الخلفية، يجب تمرير مجموعة النتائج كاملةً إلى مُختزل واحد.

يؤدي هذا المُختزل الوحيد أيضًا إلى جعل عبارة ORDER BY مكلفة على جدول كبير، لذا في الوضع الصارم (hive.mapred.mode=strict) يرفض Hive عبارة ORDER BY التي لا تحتوي على شرط LIMIT.

تُظهر لقطة الشاشة أدناه استعلام ORDER BY والصفوف المصنفة.

استعلام ORDER BY على جدول employees_guru مُرتب حسب القسم

من لقطة الشاشة أعلاه، يمكننا ملاحظة ما يلي:

  1. هذا الاستعلام يُنفذ على جدول "employees_guru" باستخدام عبارة ORDER BY، حيث يكون اسم عمود ORDER BY هو "Department". وبما أن "Department" عبارة عن سلسلة نصية، فإن النتائج تُعرض وفقًا للترتيب الأبجدي.
  2. هذه هي النتيجة الفعلية للاستعلام. يتم عرض النتائج بناءً على عمود القسم، مثل الإدارة والمالية وما إلى ذلك، بالترتيب.

الاستعلام:

SELECT * FROM employees_guru ORDER BY Department;

تجميع حسب الاستعلام

تستخدم عبارة GROUP BY أعمدة في جداول Hive للتجميعping يتم تحديد قيم الأعمدة المحددة باستخدام GROUP BY، ويقوم الاستعلام بتحديد وعرض النتائج المجمعة حسب تلك القيم.

على سبيل المثال، تُظهر لقطة الشاشة أدناه إجمالي عدد الموظفين الموجودين في كل قسم. هنا لدينا "القسم" كقيمة GROUP BY.

استعلام GROUP BY لحساب عدد الموظفين في كل قسم

من خلال لقطة الشاشة أعلاه، سنلاحظ ما يلي:

  1. إنها الاستعلام الذي يتم تنفيذه على جدول "employees_guru" باستخدام عبارة GROUP BY و Department كاسم عمود GROUP BY المحدد.
  2. يُظهر الناتج هنا اسم القسم وعدد الموظفين في مختلف الأقسام. يتم تجميع جميع الموظفين المنتمين إلى قسم معين وعرضهم، لذا فإن كل صف من النتائج يمثل اسم القسم مع إجمالي عدد موظفيه.

الاستعلام:

SELECT Department, count(*) FROM employees_guru GROUP BY Department;

الترتيب حسب

تُستخدم عبارة SORT BY لفرز أسماء أعمدة جداول Hive. يمكننا استخدام DESC للفرز تنازليًا و ASC للفرز تصاعديًا.

تقوم دالة SORT BY بترتيب الصفوف قبل إدخالها إلى المُختزل، مما يضمن الترتيب داخل كل مُختزل بدلاً من الترتيب على مستوى النتيجة بأكملها. ويعتمد الترتيب دائمًا على نوع العمود.

على سبيل المثال، إذا كان نوع العمود رقميًا، فسيتم فرزه بترتيب رقمي، وإذا كان نوع العمود نصيًا، فسيتم فرزه بترتيب معجمي.

تُظهر لقطة الشاشة أدناه استعلام SORT BY باستخدام DESC.

استعلام SORT BY على جدول employees_guru يُرجع المعرف بترتيب تنازلي

من لقطة الشاشة أعلاه يمكننا ملاحظة ما يلي:

  1. هذا هو الاستعلام الذي تم تنفيذه على جدول "employees_guru" باستخدام عبارة SORT BY و"Id" كاسم عمود SORT BY المحدد. استخدمنا الكلمة المفتاحية DESC.
  2. لذا فإن الناتج المعروض يكون بترتيب تنازلي حسب "المعرف".

الاستعلام:

SELECT * from employees_guru SORT BY Id DESC;

Cluster By

يتم استخدام CLUSTER BY كبديل لكل من DISTRIBUTE BY و SORT BY في HiveQL.

تُستخدم عبارة CLUSTER BY في الجداول الموجودة في Hive. يستخدم Hive الأعمدة الموجودة في CLUSTER BY لتوزيع الصفوف بين وحدات الاختزال، حيث تُوزّع أعمدة CLUSTER BY على عدة وحدات اختزال. كما تضمن هذه العبارة ترتيب فرز القيم الموجودة في وحدات الاختزال المتعددة.

على سبيل المثال، يُشار إلى عبارة CLUSTER BY في اسم عمود Id في جدول employees_guru. يُنتج تنفيذ هذا الاستعلام نتائج لعدة دوال اختزال في قاعدة البيانات، بينما في واجهة المستخدم، تُعد هذه العبارة بديلاً لعبارتي SORT BY و DISTRIBUTE BY.

هذه هي عملية المعالجة الخلفية عند تنفيذ استعلام باستخدام SORT BY أو GROUP BY أو CLUSTER BY في إطار عمل MapReduce. لذا، إذا أردنا تخزين النتائج في عدة وحدات اختزال، نستخدم CLUSTER BY.

تقبل قواعد CLUSTER BY أسماء الأعمدة فقط، لذلك لا يمكن إرفاق ASC و DESC بها؛ تحتاج النتيجة التنازلية إلى DISTRIBUTE BY مع SORT BY … DESC منفصل.

تُظهر لقطة الشاشة أدناه استعلام CLUSTER BY على المعرف.

استعلام CLUSTER BY على عمود Id في جدول employees_guru

من لقطة الشاشة أعلاه نحصل على الملاحظات التالية:

  1. هذا الاستعلام هو الذي يُنفذ عبارة CLUSTER BY على قيمة حقل Id. هنا سيتم فرز البيانات بناءً على قيم Id.
  2. يعرض قيم المعرف والاسم الموجودة في employees_guru بترتيب فرز.

الاستعلام:

SELECT  Id, Name from employees_guru CLUSTER BY Id;

توزيع بواسطة

تُستخدم عبارة DISTRIBUTE BY في الجداول الموجودة في Hive. يستخدم Hive الأعمدة الموجودة في DISTRIBUTE BY لتوزيع الصفوف بين وحدات الاختزال، بحيث تذهب جميع الصفوف التي تشترك في نفس قيمة عمود DISTRIBUTE BY إلى وحدة الاختزال نفسها.

  • يضمن ذلك حصول كل مُخفِّض من المُخفِّضات N على عدم تداخلping مجموعة قيم العمود
  • لا يقوم بفرز مخرجات كل مُختزل، ولا يُضمن أن تكون الصفوف المتطابقة متجاورة.

تُظهر لقطة الشاشة أدناه استعلام DISTRIBUTE BY على المعرف.

استعلام DISTRIBUT BY على عمود Id في جدول employees_guru

من لقطة الشاشة أعلاه، يمكننا ملاحظة ما يلي:

  1. يتم تنفيذ عبارة DISTRIBUTE BY على معرف جدول "employees_guru".
  2. يُظهر الناتج المعرّف والاسم. في الواجهة الخلفية، تُرسل الصفوف التي تحمل نفس المعرّف إلى نفس المُختزِل.

الاستعلام:

SELECT  Id, Name from employees_guru DISTRIBUTE BY Id;

من السهل الخلط بين البنود الأربعة، لذا يقارن الجدول أدناه بينها.

بند مخفضات ما يضمنه
ترتيب حسب واحد الترتيب الإجمالي عبر النتيجة الكاملة
ترتيب حسب كثير الطلب داخل كل مخفض فقط
يتم التوزيع بواسطة كثير نفس المفتاح يصل إلى نفس المُخفِّض، دون فرز.
التجميع حسب كثير توزيع حسب بالإضافة إلى فرز حسب، تصاعديًا

الأسئلة الشائعة

يجب على مُختزِل واحد فرز كل صف، وهو ما قد يستغرق ساعات على جدول كبير. يُحدِّد الأمر LIMIT الحدود التي تعمل. يؤدي ضبط hive.mapred.mode على nonstrict إلى إزالة القيد تمامًا.

قم بتعيين mapreduce.job.reduces قبل الاستعلام لتحديد العدد بدقة، وإلا سيقوم Hive بتقديره بناءً على حجم المدخلات. يتجاهل ORDER BY هذا الإعداد، لأن الترتيب الكلي يُختزل دائمًا إلى مُختزل واحد.

لا. تقبل هذه العبارة أسماء الأعمدة فقط، وتُرتّب النتائج دائمًا تصاعديًا. اكتب DISTRIBUTE BY على عمود التقسيم مع عمود SORT BY منفصل DESC بدلاً من ذلك؛ قد يختلف العمودان أيضًا.

هما مرتبطان لكنهما ليسا متطابقين. التغليف يقوم بتخزين الصفوف بشكل دائم في عدد ثابت من الملفات، بينما يقوم CLUSTER BY بتوزيع وفرز الصفوف فقط خلال مدة استعلام واحد.

تقوم مساعدات التعلم الآلي بقراءة خطة EXPLAIN وتحديد الأسباب مثل عبارة ORDER BY غير المحدودة، أو عامل تصفية التقسيم المفقود، أو المفتاح المنحرف. يتم التحقق من كل اقتراح مقابل وقت التشغيل الفعلي.

يُستخلص هذا النمط جيدًا من تعليق قصير. تحقق من أي شيء خاص بالمحرك، لأنه يمتزج بسهولة. Spark صيغة SQL أو Presto التي يرفضها Hive، مثل DESC بعد CLUSTER BY.

يحتوي ملف نصي عادي باسم Employees.txt على قيم الأعمدة الستة، ويتم تحميله في الجدول قبل تنفيذ الاستعلام الأول. أي ملف مفصول بعلامات فاصلة يحتوي على أعمدة متطابقة يعمل بنفس الطريقة.

الدلالات متطابقة، لأنها خصائص لغة HiveQL وليست خصائص المحرك. يختلف فقط المخطط المادي - حيث يُجدول المحرك مراحل الفرز والخلط بشكل مختلف، لذا تختلف أوقات التشغيل بينما تبقى النتائج ثابتة.

تلخيص هذه التدوينة بـ: