مثال على استعلام HBase: أوامر put() و get() و scan()

⚡ ملخص ذكي

تُعد أوامر HBase put و get و scan الأوامر الأساسية لكتابة البيانات وقراءتها، مما يسمح لك بتخزين قيمة خلية حسب الصف والعمود، أو جلب صف واحد، أو استعراض العديد من الصفوف من سطر الأوامر أو Java API.

  • ✍️ اكتب باستخدام put: يقوم الأمر put بتخزين قيمة في جدول، صف، عمود، وطابع زمني اختياري.
  • 🔍 اقرأ باستخدام get: يقوم الأمر get بإرجاع صف أو خلية واحدة، مع خيارات TIMERANGE وVERSIONS وFILTERS.
  • 📜 تصفح باستخدام الماسح الضوئي: يقوم أمر المسح بسرد العديد من الصفوف وقيم أعمدتها عبر جدول.
  • ☕ Java API: تُجرى العمليات نفسها في Java باستخدام Put و Get و Scan وفئة Bytes المساعدة.
  • 🧬 الإحداثيات: يتم تحديد كل قيمة بواسطة مفتاح الصف، وعائلة العمود، ومؤهل العمود.
  • 🤖 المساعدة بالذكاء الاصطناعي: يقوم مساعدو الذكاء الاصطناعي بصياغة التعليمات البرمجية الخاصة بالوضع والاسترجاع والمسح الضوئي، ويقترحون تصميمات فعالة لمفاتيح الصفوف.

أوامر الاستعلام HBase put() و get() و scan() في سطر الأوامر Java

كتابة البيانات إلى جدول HBase: Shell

تفترض هذه الأمثلة أن HBase هو تم التثبيت والتشغيل، واجهة HBase مفتوحة، و جدول باسم guru99 موجود بالفعل ضمن برامج التعليم والمشاريع الخاصة بعائلات الأعمدة.

يُستخدم الأمر put لتخزين البيانات في جدول.

Syntax:  put <'tablename'>,<'rowname'>,<'columnvalue'>,<'value'>

يُستخدم هذا الأمر للأمور التالية:

  • سيتم وضع "قيمة" خلية في جدول أو صف أو عمود محدد أو محدد.
  • سيقوم البرنامج، بشكل اختياري، بتنسيق الطابع الزمني.

على سبيل المثال، هنا نقوم بوضع القيم في الجدول "guru99" تحت الصف r1 والعمود c1:

hbase> put 'guru99', 'r1', 'c1', 'value', 10

لقد وضعنا ثلاث قيم، 10 و 15 و 30، في الجدول "guru99"، كما هو موضح في لقطة الشاشة أدناه.

أمر HBase shell put لإدخال القيم 10 و15 و30 في الجدول guru99

لنفترض أن الجدول "guru99" يحتوي على مرجع جدول، مثل g. يمكنك أيضًا تشغيل الأمر على مرجع الجدول، كما يلي:

hbase> g.put 'guru99', 'r1', 'c1', 'value', 10

يظهر الناتج كما هو موضح في لقطة الشاشة أعلاه بعد وضع القيم في "guru99".

قراءة البيانات من جدول HBase: Shell

في هذا القسم، نتحقق مما يلي في قذيفة HBase:

  • القيم التي يتم إدخالها في جدول HBase "guru99".
  • أسماء الأعمدة التي تحتوي على القيم الموجودة في جدول HBase guru99.

يعرض ناتج المسح أدناه كل قيمة تم إدخالها في "guru99"، بالإضافة إلى أسماء الصفوف والأعمدة الخاصة بها:

مخرجات أمر فحص HBase shell التي تعرض قيم الصفوف والأعمدة في الجدول guru99

من لقطة الشاشة أعلاه، يمكننا استنتاج ما يلي:

  • إذا قمنا بتشغيل الأمر "scan" في واجهة HBase، فسيتم عرض القيم المُدخلة في "guru99" على النحو التالي.
  • في واجهة HBase، ستعرض القيم التي أدخلها الكود الخاص بنا، مع أسماء الأعمدة والصفوف.
  • هنا يمكننا أن نرى أن أسماء الأعمدة المدرجة هي "التعليم" و "المشاريع".
  • القيم التي تم إدخالها هي "BigData" و "HBase Tutorials" في الأعمدة المذكورة.

يمكنك أيضًا استخدام أمر get لقراءة البيانات من جدول.

Syntax: get <'tablename'>, <'rowname'>, {< Additional parameters>}

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

معامل الهدف
النطاق الزمني يُعيد الخلايا التي يقع طابعها الزمني ضمن وقت بداية ونهاية محددين.
الطابع الزمني يُعيد فقط إصدار الخلية المخزنة في طابع زمني محدد.
VERSIONS يحدد عدد نسخ الخلية التي سيتم إرجاعها (القيمة الافتراضية هي 1).
فلتر يطبق عامل تصفية لتقييد الصفوف أو الأعمدة التي يتم إرجاعها.
عمود يقتصر على نتائج محددة لعائلات الأعمدة أو المؤهلات.

فيما يلي بعض الأمثلة العملية لأمر get:

hbase> get 'guru99', 'r1', {COLUMN => 'c1'}

بالنسبة للجدول "guru99"، سيتم عرض قيم الصف r1 والعمود c1 باستخدام هذا الأمر، كما هو موضح في لقطة الشاشة أدناه.

أمر HBase shell get يُعيد صفًا واحدًا r1 من الجدول guru99

hbase> get 'guru99', 'r1'

بالنسبة للجدول "guru99"، سيتم عرض قيم الصف r1 باستخدام هذا الأمر.

hbase> get 'guru99', 'r1', {TIMERANGE => [ts1, ts2]}

بالنسبة للجدول "guru99"، سيتم عرض قيم الصف r1 في النطاق الزمني من ts1 إلى ts2 باستخدام هذا الأمر.

hbase> get 'guru99', 'r1', {COLUMN => ['c1', 'c2', 'c3']}

بالنسبة للجدول "guru99"، سيتم عرض قيم الصف r1 وعائلات الأعمدة c1 و c2 و c3 باستخدام هذا الأمر.

كتابة البيانات إلى جدول HBase: JAVA API

في هذه الخطوة، سنقوم بكتابة البيانات في جدول HBase "guru99".

أولًا، علينا كتابة كود لإدراج واسترجاع القيم من HBase، باستخدام برنامج HBaseLoading.java. لإنشاء وإدراج القيم في جدول على مستوى الأعمدة، اكتب الكود كما هو موضح أدناه.

تُظهر لقطة الشاشة أدناه Java الكود الذي يقوم بإنشاء تكوين HBase وإدخال القيم في "guru99":

Java كود لإنشاء تكوين HBase وإدخال القيم باستخدام واجهة برمجة تطبيقات Put

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

  • عندما نقوم بإنشاء تكوين HBase، فإنه يشير إلى أي تكوينات قمنا بتعيينها في ملفي hbase-site.xml و hbase-default.xml أثناء تثبيت HBase.
  • إنشاء جدول "guru99" باستخدام طريقة HTable.
  • إضافة الصف الأول إلى الجدول "guru99".
  • تحديد اسمي العمودين "التعليم" و"المشاريع" وإدخال القيم في اسمي العمودين في الصف الأول (row1) الخاص بكل منهما. القيم المُدخلة هنا هي: BigData و"HBaseTutorials".

قراءة البيانات من جدول HBase: Java API

أيًا كانت القيم التي وضعناها في جدول HBase في القسم أعلاه، سنقوم هنا بجلب وعرض تلك القيم.

يُظهر ناتج وحدة التحكم أدناه البيانات التي تتم قراءتها من جدول HBase "guru99":

Java مخرجات وحدة التحكم التي تقرأ قيم عمودَي التعليم والمشاريع من جدول HBase guru99

لاسترجاع النتائج المخزنة في "guru99":

  • سنقوم هنا بجلب القيم المخزنة في عائلات الأعمدة، أي "التعليم" و "المشاريع".
  • باستخدام الأمر "get"، سنقوم بجلب القيم المخزنة في جدول HBase.
  • يتم عرض نتائج المسح باستخدام الأمر "scan". ستظهر القيم المخزنة في الصف الأول على وحدة التحكم.

بمجرد كتابة الكود، تقوم بتشغيله Java استمارتنا مثله:

انقر بزر الماوس الأيمن على HBaseLoading.java -> تشغيل كـ -> Java تطبيق.

بعد تشغيل "HBaseLoading.java"، يتم إدخال القيم في "guru99" في كل عمود في HBase، ويمكن للبرنامج نفسه استرداد القيم أيضًا.

ها هو الكود الكامل:

import java.io.IOException;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;
public class HBaseLoading
{
public static void main(String[] args) throws IOException
{
/* When you create a HBaseConfiguration, it reads in whatever you've set into your hbase-site.xml and in hbase-default.xml, as long as these can be found on the CLASSPATH*/

org.apache.hadoop.conf.Configuration config = HBaseConfiguration.create();

/*This instantiates an HTable object that connects you to the "test" table*/

HTable table = new HTable(config, "guru99");

/* To add to a row, use Put. A Put constructor takes the name of the row you want to insert into as a byte array.*/

Put p = new Put(Bytes.toBytes("row1"));

/*To set the value you'd like to update in the row 'row1', specify the column family, column qualifier, and value of the table cell you'd like to update. The column family must already exist in your table schema. The qualifier can be anything.*/

p.add(Bytes.toBytes("education"), Bytes.toBytes("col1"),Bytes.toBytes("BigData"));
p.add(Bytes.toBytes("projects"),Bytes.toBytes("col2"),Bytes.toBytes("HBaseTutorials"));

// Once you've adorned your Put instance with all the updates you want to make, to commit it do the following

table.put(p);

// Now, to retrieve the data we just wrote.

Get g = new Get(Bytes.toBytes("row1"));
Result r = table.get(g);

byte [] value = r.getValue(Bytes.toBytes("education"),Bytes.toBytes("col1"));
byte [] value1 = r.getValue(Bytes.toBytes("projects"),Bytes.toBytes("col2"));
String valueStr = Bytes.toString(value);

String valueStr1 = Bytes.toString(value1);
System.out.println("GET: " +"education: "+ valueStr+"projects: "+valueStr1);

Scan s = new Scan();

s.addColumn(Bytes.toBytes("education"), Bytes.toBytes("col1"));
s.addColumn(Bytes.toBytes("projects"), Bytes.toBytes("col2"));
ResultScanner scanner = table.getScanner(s);
try
{
for (Result rr = scanner.next(); rr != null; rr = scanner.next())
{
System.out.println("Found row : " + rr);
}
} finally
{
// Make sure you close your scanners when you are done!

scanner.close();
}
}
}

ملاحظة حول إصدارات واجهة برمجة التطبيقات (API): يستخدم المثال أعلاه فئة HTable ودالة add() الخاصة بها، والتي تعكس واجهة برمجة تطبيقات عميل HBase القديمة. منذ إصدار HBase 1.0، أصبحت HTable مهملة. يحصل الكود الحديث على جدول من خلال ConnectionFactory.createConnection(…).getTable(…) وينشئ عملية Put باستخدام addColumn() بدلاً من add(). يبقى منطق عمليات put وget وscan كما هو.

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

يسترجع الأمر get صفًا واحدًا باستخدام مفتاحه، وينتهي بسرعة. أما الأمر scan فيقرأ عدة صفوف بالتسلسل عبر جدول أو نطاق مفاتيح، مع إمكانية التصفية حسب الأعمدة أو الوقت. استخدم get للبحث عن صف واحد، و scan لاستعراض أو تصدير عدة صفوف.

عائلة الأعمدة هي مجموعة مُسماة من الأعمدة تُخزّن معًا وتُعرّف عند إنشاء الجدول. مُحدِّد العمود هو اسم العمود الفردي داخل تلك العائلة، مثل education:col1. يجب أن تكون العائلات موجودة في المخطط؛ ويمكن إضافة المُحدِّدات بحرية عند الكتابة.

استخدم أمر الحذف لإزالة خلية واحدة، على سبيل المثال: delete 'guru99', 'r1', 'c1'. استخدم deleteall لإزالة صف كامل: deleteall 'guru99', 'r1'. لإفراغ جدول بالكامل، قم بتعطيله، ثم شغّل الأمر truncate 'guru99'، الذي سيحذفه ويعيد إنشائه.

يحتفظ HBase بنسخ متعددة من كل خلية، مُؤرَّخة زمنيًا. يُحدَّد عدد النسخ المحفوظة لكل مجموعة أعمدة بواسطة الخاصية VERSIONS، والتي تكون قيمتها الافتراضية 1. أضف {VERSIONS => 3} إلى عملية get أو scan لإرجاع عدة نسخ، أو أضف TIMESTAMP لجلب نسخة واحدة محددة.

شغّل الأمر list لعرض جميع الجداول في HBase. شغّل الأمر count 'guru99' لحساب عدد الصفوف في جدول، مع إمكانية تحديد فترة زمنية (INTERVAL) لمتابعة التقدم. استخدم الأمر describe 'guru99' لعرض عائلات الأعمدة، والأمر status 'simple' للتحقق من سلامة المجموعة.

لا يدعم HBase لغة SQL بشكل أصلي، لكن Apache Phoenix يُضيف طبقة SQL تُحوّل الاستعلامات إلى عمليات put وget وscan أصلية. كما يدعم صيغ SELECT وUPSERT وJOIN المألوفة، مما يُسهّل الاستعلام عن HBase للفرق المُتقنة للغة SQL.

يمكن لمساعدي البرمجة بالذكاء الاصطناعي ونماذج اللغة الكبيرة صياغة أوامر HBase shell و Java يُقدّم كود العميل استجابةً لرسالة نصية بسيطة، ويقترح تصميمات مفاتيح الصفوف، ويشرح عوامل تصفية المسح. كما يُساعد التعلّم الآلي في تحسين الأداء من خلال التنبؤ بالمناطق الأكثر استخدامًا، مع ضرورة قيام المهندس بالتحقق من كل استعلام مُولّد.

نعم. مساعد الطيار جيثب يمكن إنشاء مقتطفات HBase put و get و scan في Java أو الصدفة من تعليق قصير، بما في ذلك استدعاءات Bytes.toBytes وفلاتر Scan. Revاطلع على المخرجات للتأكد من اسم الجدول الصحيح، وعائلات الأعمدة، وواجهة برمجة تطبيقات الجدول الحالية قبل تشغيلها.

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