سنناقش في هذه المدونة نموذجًا لإثبات مفهوم HBase.
هنا لدينا مجموعة بيانات كما في الصورة أدناه.
تتكون مجموعة البيانات هذه من تفاصيل حول مدة إجمالي المكالمات الواردة والمكالمات الصادرة والرسائل المرسلة من رقم هاتف محمول معين في تاريخ محدد.
يمثل الحقل الأول التاريخ ، ويمثل الحقل الثاني رقم الهاتف المحمول ، ويمثل الحقل الثالث المدة الإجمالية للمكالمات الواردة ، ويمثل الحقل الرابع المدة الإجمالية للمكالمات الصادرة ، ويمثل الحقل الخامس إجمالي عدد الرسائل المرسلة.
مهمتنا الآن هي استرداد معلومات مدة المكالمات الواردة والصادرة والرسائل المرسلة ، من رقم هاتف في تاريخ معين.
في حالة الاستخدام هذه ، أحاول تصفية سجلات 15العاشرمارس 2014. هنا برنامج HBase لتحقيق ذلك.
أدناه هو الرمز الكامل لها.
عامة صف دراسي عينة{
نشر ثابتة ترتيب أسيوط
ثابتة HTable الطاولة
عامة عينة (String tableName، String colFams) رميات استثناء IO {
أسيوط = HBaseConfiguration. خلق ()
createTable (tableName، colFams)
الطاولة = جديد HTable ( أسيوط ، اسم الطاولة)
}
باطل createTable (String tableName، String colFams) رميات استثناء IO {
HBaseAdmin hbase = جديد HBaseAdmin ( أسيوط )
وصف HTableDescriptor = جديد HTableDescriptor (اسم الجدول)
HColumnDescriptor الوصفية = جديد HColumnDescriptor (colFams.getBytes ())
desc.addFamily (ميتا)
hbase.createTable (تنازلي)
}
عامة ثابتة باطل addColumnEntry (String tableName ، String row ،
سلسلة colFamilyName ، سلسلة colName ، قيم السلسلة)
رميات استثناء IO {
بايت [] rowKey = بايت. toBytes (صف)
ضع putdata = جديد ضع (rowKey)
putdata.add (بايت. toBytes (colFamilyName) ، بايت. toBytes (colName) ،
يمكن استخدام خوارزمية الفرز لترتيب مجموعة من ________ بترتيب ________.
بايت. toBytes (القيم))
الطاولة .put (putdata)
}
عامة ثابتة باطل getAllRecord (String tableName، String startPartialKey،
سلسلة endPartialKey) رميات استثناء IO {
محاولة {
تفحص s
إذا (startPartialKey == لا شيء || endPartialKey == لا شيء )
ق = جديد مسح ()
آخر
ق = جديد مسح (بايت. toBytes (startPartialKey) ،
بايت. toBytes (endPartialKey))
ResultScanner ss = الطاولة .getScanner (s)
خريطة التجزئة
سلسلة imsi = ''
إلى عن على (النتيجة ص: ث) {
HashMap keyVal = جديد خريطة التجزئة()
إلى عن على (KeyValue kv: r.raw ()) {
imsi = جديد سلسلة (kv.getRow ()). سلسلة فرعية (10)
keyVal.put ( جديد سلسلة (kv.getQualifier ()) ،
جديد سلسلة (kv.getValue ()))
outputRec.put (imsi ، keyVal)
إذا (keyVal.size () == 3)
النظام. خارج .println (خذ + '' + 'دقائق واردة:'
+ keyVal.get (“c1 ″) +” الدقائق القادمة: '
+ keyVal.get (“c2 ″) +” الرسائل: '
+ keyVal.get (“c3”))
}
}
} أخيرا {
}
}
عامة ثابتة باطل رئيسي (سلسلة [] args) رميات استثناء IO {
String tableName = 'سجلات البيانات'
String colFamilyNames = 'i'
اختبار العينة = جديد عينة (tableName ، colFamilyNames)
String fileName = '/ home / cloudera / Desktop / data'
// سيشير هذا إلى سطر واحد في كل مرة
خط السلسلة = لا شيء
محاولة {
// يقرأ FileReader الملفات النصية في الترميز الافتراضي.
خوارزمية جدولة روبن في ج
FileReader fileReader = جديد FileReader (اسم الملف)
// دائمًا التفاف FileReader في BufferedReader.
BufferedReader bufferedReader = جديد BufferedReader (fileReader)
في حين ((line = bufferedReader.readLine ())! = لا شيء ) {
سلسلة [] قيم = line.split (”“)
addColumn الدخول (اسم الجدول ، القيم [0] + '-' + القيم [1] ،
colFamilyNames ، 'c1' ، القيم [2])
addColumn الدخول (اسم الجدول ، القيم [0] + '-' + القيم [1] ،
colFamilyNames ، 'c2' ، القيم [3])
addColumn الدخول (اسم الجدول ، القيم [0] + '-' + القيم [1] ،
colFamilyNames ، 'c3' ، القيم [4])
}
مخزنةReader.close ()
} قبض على (FileNotFoundException ex) {
النظام. خارج .println ('تعذر فتح الملف' '+ اسم الملف +' '')
} قبض على (استثناءات IO) {
النظام. خارج .println ('خطأ في قراءة الملف' '+ اسم الملف +' ')
// أو يمكننا القيام بذلك:
// ex.printStackTrace ()
}
getAllRecord (tableName، “20140315”، “20140316”)
}
}
هنا قمنا بإنشاء كائن التكوين ، فئة HTable وإنشاء Hbase Table بالاسم: سجلات التاريخ وعائلة العمود: أنا .
في حالة الاستخدام هذه ، سنأخذ مجموعة التاريخ ورقم الهاتف المحمول مفصولة بعلامة '-' كمفتاح صف لجدول Hbase هذا ومدد المكالمات الواردة والصادرة '، وعدد الرسائل المرسلة كأعمدة' c1 '،' c2 '،' c3 'لعائلة الأعمدة 'i'.
لدينا بيانات الإدخال المخزنة في نظام الملفات المحلي في Cloudera. لذلك نحن بحاجة إلى كتابة Java Logic التي تقرأ البيانات من الملف.
يوجد أدناه منطق جافا.
في هذه الطريقة نقوم بتخزين البيانات في الجدول لكل عمود من عائلة الأعمدة.
يمكننا التحقق من البيانات المخزنة في جدول Hbase 'سجلات البيانات' باستخدام أمر المسح.
سوف تتلقى البيانات كما في الصورة أدناه.
الآن قمنا بإدخال البيانات في HBase Table بنجاح.
دعونا نسترجع السجلات المخزنة في جدول تاريخ معين.
في حالة الاستخدام هذه ، نحاول استرداد سجلات التاريخ: 15العاشرمارس 2014
لاسترداد السجلات قمنا بإنشاء طريقة
getAllRecord (String tableName، String startPartialKey، String endPartialKey)
تمثل المعلمة الأولى اسم الجدول ، بينما تمثل المعلمة الثانية تاريخ البدء الذي نحتاج منه لاسترداد البيانات والثالثة هي تاريخ البدء التالي.
على سبيل المثال:
getAllRecord (tableName، “20140315”، “20140316”)
الآن دعونا نفهم منطق من هذه الطريقة.
نحن نحاول فحص جدول Hbase باستخدام HBase API بمساعدة startPartialKey و endPartialKey.
نظرًا لأن StartPartialKey و endPartialkey ليسا فارغين ، فسيتم الانتقال إلى حظر آخر ومسح السجلات التي لها قيمة startPartialKey.
لقد أنشأنا كائنًا من الماسح الضوئي للنتائج الذي يخزن السجلات الممسوحة ضوئيًا لجدول Hbase و HashMap لتخزين الإخراج الذي سينتج.
نقوم بإنشاء كائن نتيجة للحصول على مخزن البيانات في Result Scanner وتنفيذ حلقة for.
imsi هي السلسلة التي تم تعريفها لتخزين رقم الهاتف المحمول و keyVal هي خريطة تجزئة تخزن الإخراج المسترجع من عمود هاتف معين.
اعطينا 20140315-1234567890 مثل مفتاح الصف إلى جدول Hbase. في هذا 20140315 يمثل التاريخ ويمثل 1234567890 رقم الهاتف المحمول.
نظرًا لأننا نطلب فقط رقم الهاتف المحمول ، فإننا نستخدم طريقة السلسلة الفرعية لاسترداده.
نقوم باسترداد البيانات من r.raw () وتخزينها في HashMap باستخدام Put.
أخيرًا نحاول طباعتها على وحدة التحكم.
سيكون الإخراج كما في الصورة أدناه.
لقد نجحنا في استرداد سجلات التاريخ: 15العاشرمارس 2014.