В този блог ще обсъдим примерно доказателство за концепцията за HBase.
Тук имаме набор от данни, както е на изображението по-долу.
Този набор от данни се състои от подробности за продължителността на общите входящи повиквания, изходящи повиквания и съобщенията, изпратени от определен мобилен номер на определена дата.
Първото поле представлява дата, второто поле представлява мобилен номер, третото поле представлява общата продължителност на входящите повиквания, четвъртото поле представлява общата продължителност на изходящите повиквания и петото поле представлява общия брой изпратени съобщения.
Сега нашата задача е да извлечем информацията за продължителността на входящите и изходящите обаждания и изпратените съобщения от телефонен номер на определена дата.
В този случай се опитвам да филтрирам записите от 15тиМарт 2014 г. Ето програма за HBase за постигане на това.
По-долу е даден пълният код на него.
публично клас проба{
как да създам пакет
частни статични Конфигурация конф
статични HTable маса
публично пример (String tableName, String colFams) хвърля IOException {
конф = HBaseConfiguration. създайте ()
createTable (tableName, colFams)
маса = ново HTable ( конф , tableName)
}
нищожен createTable (String tableName, String colFams) хвърля IOException {
HBaseAdmin hbase = ново HBaseAdmin ( конф )
HTableDescriptor desc = ново HTableDescriptor (tableName)
HColumnDescriptor мета = ново HColumnDescriptor (colFams.getBytes ())
desc.addFamily (мета)
hbase.createTable (desc)
}
публично статични нищожен addColumnEntry (StringName table, String row,
String colFamilyName, String colName, String стойности)
хвърля IOException {
байт [] rowKey = Байтове. toBytes (ред)
Поставете putdata = ново Поставете (rowKey)
putdata.add (Байтове. toBytes (colFamilyName), байтове. toBytes (colName),
Байтове. toBytes (стойности))
маса .put (putdata)
}
публично статични нищожен getAllRecord (String tableName, String startPartialKey,
String endPartialKey) хвърля IOException {
опитвам {
Сканиране s
ако (startPartialKey == нула || endPartialKey == нула )
s = ново Сканиране ()
друго
s = ново Сканиране (байтове. toBytes (startPartialKey),
Байтове. toBytes (endPartialKey))
ResultScanner ss = маса .getScanner (и)
HashMap
Низ imsi = “”
за (Резултат r: ss) {
HashMap keyVal = ново HashMap ()
за (KeyValue kv: r.raw ()) {
imsi = ново String (kv.getRow ()). Substring (10)
keyVal.put ( ново String (kv.getQualifier ()),
ново Низ (kv.getValue ()))
outputRec.put (imsi, keyVal)
ако (keyVal.size () == 3)
Система. навън .println (вземете + ”” + “Входящи минути:”
+ keyVal.get (“c1 ″) +” Изходящи минути: ”
+ keyVal.get („c2 ″) +“ Съобщения: “
+ keyVal.get (“c3”))
}
}
} накрая {
}
}
публично статични нищожен main (String [] аргументи) хвърля IOException {
String tableName = “daterecords”
Низ colFamilyNames = „i“
пробен тест = ново пример (tableName, colFamilyNames)
String fileName = “/ home / cloudera / Desktop / data”
// Това ще се позовава на един ред наведнъж
Линия на низа = нула
опитвам {
// FileReader чете текстови файлове в кодирането по подразбиране.
FileReader fileReader = ново FileReader (fileName)
// Винаги обвивайте FileReader в BufferedReader.
Буфериран четец буфериран четец = ново BufferedReader (файлReader)
докато ((ред = буфериранReader.readLine ())! = нула ) {
String [] стойности = line.split (”“)
addColumnEntry (tableName, стойности [0] + “-” + стойности [1],
colFamilyNames, “c1”, стойности [2])
addColumnEntry (tableName, стойности [0] + “-” + стойности [1],
colFamilyNames, “c2”, стойности [3])
addColumnEntry (tableName, стойности [0] + “-” + стойности [1],
colFamilyNames, “c3”, стойности [4])
}
bufferedReader.close ()
} улов (FileNotFoundException ex) {
Система. навън .println („Не може да се отвори файл„ “+ име на файла +„ „“)
} улов (IOException ex) {
Система. навън .println („Грешка при четене на файл„ “+ име на файл +„ „“)
// Или можем просто да направим това:
// ex.printStackTrace ()
}
getAllRecord (tableName, “20140315”, “20140316”)
}
}
Тук създадохме обект от Configuration, HTable клас и създаваме таблицата Hbase с име: daterecords и семейството на колоните: i .
В този случай ще използваме комбинацията от дата и мобилен номер, разделени с „-“ като ключ на реда за тази таблица Hbase и продължителността на входящите, изходящите повиквания „, броя на съобщенията, изпратени като колоните„ c1 “, c2 ',' c3 'за семейството колони' i '.
Входящите данни се съхраняват в локалната файлова система на Cloudera. Затова трябва да напишем Java Logic, която чете данните от файла.
По-долу е логиката на Java.
В този метод съхраняваме данните в таблицата за всяка колона от семейството колони.
Можем да проверим данните, съхранени в таблицата Hbase ‘daterecords’, като използваме командата за сканиране.
Ще получите данните, както е показано на изображението по-долу.
Сега успешно вмъкнахме данните в таблицата HBase.
Нека извлечем записите, съхранявани в таблицата на определена дата.
В този случай се опитваме да извлечем записите на Дата: 15тиМарт 2014 г.
За да извлечем записите, ние създадохме метод
getAllRecord (String tableName, String startPartialKey, String endPartialKey)
Първият параметър представлява името на таблицата, вторият представлява началната дата, от която трябва да извлечем данните, а третият е следващата дата на началната дата.
E.g:
getAllRecord (tableName, “20140315”, “20140316”)
Сега нека разберем логика от този метод.
Опитваме се да сканираме таблицата Hbase с помощта на HBase API с помощта на startPartialKey и endPartialKey.
Тъй като StartPartialKey и endPartialkey не са нула, той ще премине към else block и ще сканира записите със стойността startPartialKey.
как да използвам итератор в java -
Създадохме обект на Result scanner, който съхранява сканираните записи на таблицата Hbase и HashMap, за да съхранява изхода, който ще бъде резултат.
Създаваме обект на Result, за да получим хранилището за данни в Result Scanner и изпълняваме цикъл for.
imsi е низът, който е дефиниран за съхраняване на мобилния номер, а keyVal е хеш карта, която съхранява изхода, извлечен от колоната на определен телефон.
Ние сме дали 20140315-1234567890 като rowkey към таблицата Hbase. В това 20140315 представлява датата, а 1234567890 представлява мобилния номер.
Тъй като ние се нуждаем само от мобилния номер, ние използваме метода на подниз, за да го извлечем.
Извличаме данните от r.raw () и ги съхраняваме в HashMap с помощта на Put.
Накрая се опитваме да ги отпечатаме на конзолата.
Резултатът ще бъде както на изображението по-долу.
Успешно изтеглихме записите на Дата: 15тиМарт 2014 г.