Na tym blogu omówimy przykładowy dowód koncepcji dla HBase.
Tutaj mamy zestaw danych jak na poniższym obrazku.
Ten zestaw danych składa się ze szczegółów dotyczących czasu trwania wszystkich połączeń przychodzących, połączeń wychodzących oraz wiadomości wysłanych z określonego numeru telefonu komórkowego w określonym dniu.
Pierwsze pole reprezentuje datę, drugie pole numer telefonu komórkowego, trzecie pole przedstawia całkowity czas trwania połączeń przychodzących, czwarte pole reprezentuje całkowity czas trwania połączeń wychodzących, a piąte pole reprezentuje całkowitą liczbę wysłanych wiadomości.
Teraz naszym zadaniem jest pobranie informacji o czasie trwania połączeń przychodzących i wychodzących oraz wysłanych wiadomości z numeru telefonu w określonym dniu.
W tym przypadku próbuję przefiltrować rekordy 15thMarzec 2014. Oto program HBase, który pozwala to osiągnąć.
Poniżej znajduje się pełny kod.
publiczny klasa próba{
prywatny statyczny Konfiguracja conf
statyczny HTable stół
publiczny sample (String tableName, String colFams) rzuca IOException {
conf = HBaseConfiguration. Stwórz ()
createTable (tableName, colFams)
stół = Nowy HTable ( conf , Nazwa tabeli)
}
unieważnić createTable (String tableName, String colFams) rzuca IOException {
HBaseAdmin hbase = Nowy HBaseAdmin ( conf )
HTableDescriptor desc = Nowy HTableDescriptor (tableName)
HColumnDescriptor meta = Nowy HColumnDescriptor (colFams.getBytes ())
desc.addFamily (meta)
hbase.createTable (malejąco)
}
publiczny statyczny unieważnić addColumnEntry (String nazwa-tabeli, wiersz ciągu,
String colFamilyName, String colName, String values)
rzuca IOException {
bajt [] rowKey = Bajty. toBytes (rząd)
Umieść putdata = Nowy Put (rowKey)
putdata.add (Bytes. toBytes (colFamilyName), Bytes. toBytes (colName),
Bajty. toBytes (wartości))
stół .put (putdata)
}
publiczny statyczny unieważnić getAllRecord (String tableName, String startPartialKey,
String endPartialKey) rzuca IOException {
próbować {
Skan s
Jeśli (startPartialKey == zero || endPartialKey == zero )
s = Nowy Skanowanie()
jeszcze
s = Nowy Skanuj (bajty. toBytes (startPartialKey),
Bajty. toBytes (endPartialKey))
co robi init w Pythonie
ResultScanner ss = stół .getScanner (s)
HashMap
Ciąg imsi = „”
dla (Wynik r: ss) {
HashMap keyVal = Nowy HashMap ()
dla (KeyValue kv: r.raw ()) {
imsi = Nowy Ciąg (kv.getRow ()). Substring (10)
keyVal.put ( Nowy Ciąg (kv.getQualifier ()),
Nowy Ciąg (kv.getValue ()))
outputRec.put (imsi, keyVal)
Jeśli (keyVal.size () == 3)
System. na zewnątrz .println (take + ”” + „Incoming minutes:”
+ keyVal.get ('c1 ″) +' Nadchodzące minuty: '
+ keyVal.get („c2 ″) +” Wiadomości: ”
+ keyVal.get („c3”))
}
}
} Wreszcie {
}
}
publiczny statyczny unieważnić main (ciąg [] argumentów) rzuca IOException {
String tableName = „daterecords”
String colFamilyNames = „i”
przykładowy test = Nowy sample (tableName, colFamilyNames)
String fileName = „/ home / cloudera / Desktop / data”
// To będzie odwoływać się do jednej linii na raz
Linia ciągów = zero
próbować {
// FileReader czyta pliki tekstowe w domyślnym kodowaniu.
FileReader fileReader = Nowy FileReader (nazwa_pliku)
// Zawsze zawijaj FileReader w BufferedReader.
BufferedReader bufferedReader = Nowy BufferedReader (fileReader)
podczas ((line = bufferedReader.readLine ())! = zero ) {
Ciąg [] wartości = line.split (”„)
addColumnEntry (nazwaTabeli, wartości [0] + „-” + wartości [1],
colFamilyNames, „c1”, wartości [2])
addColumnEntry (nazwaTabeli, wartości [0] + „-” + wartości [1],
colFamilyNames, „c2”, wartości [3])
addColumnEntry (nazwaTabeli, wartości [0] + „-” + wartości [1],
colFamilyNames, „c3”, wartości [4])
}
bufferedReader.close ()
} łapać (FileNotFoundException ex) {
System. na zewnątrz .println („Nie można otworzyć pliku„ ”+ nazwa_pliku +„ ‘”)
} łapać (IOException ex) {
System. na zewnątrz .println („Błąd podczas odczytu pliku„ ”+ nazwa_pliku +„ ‘”)
// Albo możemy po prostu zrobić to:
// ex.printStackTrace ()
}
getAllRecord (tableName, „20140315”, „20140316”)
}
}
Tutaj stworzyliśmy obiekt o nazwie Configuration, HTable i stworzyliśmy Hbase Table o nazwie: daterecords i rodzina kolumn: ja .
W tym przypadku weźmiemy kombinację daty i numeru telefonu komórkowego oddzielone znakiem „-” jako klucz wiersza dla tej tabeli Hbase oraz czas trwania połączeń przychodzących i wychodzących ”, liczbę wysłanych wiadomości jako kolumny„ c1 ”,„ c2 ”,„ c3 ”dla rodziny kolumn„ i ”.
Mamy dane wejściowe przechowywane w lokalnym systemie plików Cloudera. Musimy więc napisać Java Logic, która odczytuje dane z pliku.
Poniżej znajduje się logika Java.
W tej metodzie przechowujemy dane w tabeli dla każdej kolumny rodziny kolumn.
różnica między ostatecznym finałem a finalizacją
Możemy sprawdzić dane zapisane w tabeli Hbase „daterecords” za pomocą polecenia scan.
Otrzymasz dane jak na poniższym obrazku.
Teraz pomyślnie wstawiliśmy dane do tabeli HBase.
Odzyskajmy zapisy zapisane w Tabeli określonej daty.
W tym przypadku próbujemy pobrać rekordy z dnia: 15thmarzec 2014
Aby pobrać rekordy, stworzyliśmy metodę
getAllRecord (String tableName, String startPartialKey, String endPartialKey)
Pierwszy parametr reprezentuje nazwę tabeli, drugi to data początkowa, z której musimy pobrać dane, a trzeci to kolejna data rozpoczęcia.
Na przykład:
getAllRecord (tableName, „20140315”, „20140316”)
Teraz zrozummy logika tej metody.
Próbujemy przeskanować tabelę Hbase za pomocą interfejsu API HBase przy pomocy startPartialKey i endPartialKey.
Ponieważ StartPartialKey i endPartialkey nie mają wartości null, przejdzie do innego bloku i przeskanuje rekordy o wartości startPartialKey.
Stworzyliśmy obiekt skanera wyników, który przechowuje zeskanowane rekordy tabeli Hbase i HashMap do przechowywania wyników, które będą wynikiem.
Tworzymy obiekt Result, aby pobrać magazyn danych w Scanner Result i wykonać pętlę for.
imsi to ciąg zdefiniowany do przechowywania numeru telefonu komórkowego, a keyVal to mapa skrótów, która przechowuje dane wyjściowe pobrane z kolumny określonego telefonu.
Daliśmy 20140315-1234567890 jako rowkey do tabeli Hbase. W tym 20140315 oznacza datę, a 1234567890 oznacza numer telefonu komórkowego.
Ponieważ wymagamy tylko numeru telefonu komórkowego, do jego pobrania używamy metody podciąg.
Pobieramy dane z r.raw () i przechowujemy je w HashMap za pomocą Put.
Wreszcie próbujemy wydrukować je na konsoli.
Wyjście będzie takie jak na poniższym obrazku.
Pomyślnie pobraliśmy zapisy z dnia: 15thMarzec 2014.