Sample HBase POC

En aquest post es parla d’una mostra de prova de concepte per a HBase. Podeu trobar una explicació clara del concepte per millorar la vostra comprensió de HBase.



En aquest bloc parlarem sobre una mostra de prova de concepte per a HBase.



Aquí tenim un conjunt de dades com a la imatge següent.

Sample_Hbase_Use_case



Aquest conjunt de dades consta dels detalls sobre la durada de les trucades entrants, de les trucades sortints i dels missatges enviats des d’un número de mòbil concret en una data específica.

El primer camp representa la data, el segon camp representa el número de mòbil, el tercer camp representa la durada total de les trucades entrants, el quart camp representa la durada total de les trucades sortints i el cinquè camp representa el nombre total de missatges enviats.

Ara la nostra tasca és recuperar la informació de la durada de les trucades i missatges entrants i sortints enviats, des d’un número de telèfon en una data concreta.



En aquest cas d’ús, intento filtrar els registres de 15thMarç de 2014. Aquí hi ha un programa HBase per aconseguir-ho.

A continuació es mostra el codi complet de la mateixa.

públic classe mostra{

privat estàtic Configuració conf

estàtic HTable taula

públic mostra (String tableName, String colFams) llança IOException {

conf = HBaseConfiguration. crear ()

createTable (tableName, colFams)

taula = nou HTable ( conf , nom_tabla)

}

buit createTable (String tableName, String colFams) llança IOException {

HBaseAdmin hbase = nou HBaseAdmin ( conf )

HTableDescriptor desc = nou HTableDescriptor (tableName)

HColumnDescriptor meta = nou HColumnDescriptor (colFams.getBytes ())

desc.addFamily (meta)

hbase.createTable (desc)

}

públic estàtic buit addColumnEntry (String tableName, String row,

String colFamilyName, String colName, String values)

llança IOException {

byte [] rowKey = Bytes. toBytes (fila)

Posa putdata = nou Posa (filaClau)

putdata.add (Bytes. toBytes (colFamilyName), Bytes. toBytes (colName),

Bytes. toBytes (valors))

taula .put (putdata)

}

públic estàtic buit getAllRecord (String tableName, String startPartialKey,

Cadena endPartialKey) llança IOException {

provar {

Escaneja s

si (startPartialKey == nul || endPartialKey == nul )

s = nou Escaneja ()

en cas contrari

s = nou Escaneig (bytes. toBytes (startPartialKey),

Bytes. toBytes (endPartialKey))

ResultScanner ss = taula .getScanner (s)

HashMapoutputRec = nou HashMap()

String imsi = ''

per (Resultat r: ss) {

HashMap keyVal = nou HashMap ()

per (KeyValue kv: r.raw ()) {

imsi = nou Cadena (kv.getRow ()). Subcadena (10)

keyVal.put ( nou Cadena (kv.getQualifier ()),

nou Cadena (kv.getValue ()))

outputRec.put (imsi, keyVal)

si (keyVal.size () == 3)

Sistema. fora .println (pren + '' + 'Minuts entrants:'

+ keyVal.get ('c1 ″) +' Minutes pròxims: '

+ keyVal.get ('c2') + 'Missatges:'

+ keyVal.get ('c3'))

}

}

} finalment {

}

}

públic estàtic buit main (String [] args) llança IOException {

String tableName = 'registres de dades'

python converteix el número en binari

String colFamilyNames = “i”

prova de mostra = nou mostra (tableName, colFamilyNames)

String fileName = '/ home / cloudera / Desktop / data'

// Això farà referència a una línia a la vegada

Línia de cadena = nul

provar {

// FileReader llegeix fitxers de text a la codificació predeterminada.

FileReader nou FileReader (fileName)

// Emboliqueu sempre FileReader a BufferedReader.

Lector de memòria intermèdia nou BufferedReader (fileReader)

mentre ((línia = bufferedReader.readLine ())! = nul ) {

Cadena [] valors = line.split ('')

addColumnEntry (TableName, valors [0] + '-' + valors [1],

colFamilyNames, 'c1', valors [2])

addColumnEntry (TableName, valors [0] + '-' + valors [1],

colFamilyNames, 'c2', valors [3])

addColumnEntry (TableName, valors [0] + '-' + valors [1],

colFamilyNames, 'c3', valors [4])

}

bufferedReader.close ()

} atrapar (Ex FileNotFoundException) {)

Sistema. fora .println (“No es pot obrir el fitxer‘ ”+ nom_fitxer +“ ‘”)

} atrapar (Excepció IOException) {

Sistema. fora .println (“Error en llegir el fitxer‘ ”+ nom_fitxer +“ ‘”)

// O simplement podríem fer això:

// ex.printStackTrace ()

}

getAllRecord (TableName, '20140315', '20140316')

}

}

Aquí hem creat un objecte de configuració, classe HTable i la creació de la taula Hbase amb el nom: daterecords i la família de columnes: jo .

En aquest cas d'ús, agafarem la combinació de la data i el número de mòbil separats per '-' com a clau de fila per a aquesta taula Hbase i la durada de les trucades entrants i sortints ', el nombre de missatges enviats com a columnes' c1 ' c2 ',' c3 'per a la família de columnes' i '.

Tenim les dades d’entrada emmagatzemades al sistema de fitxers local de Cloudera. Per tant, hem d’escriure Java Logic que llegeixi les dades del fitxer.

A continuació es mostra la lògica Java.

En aquest mètode, estem emmagatzemant les dades a la taula de cada columna de la família de columnes.

Podem comprovar les dades emmagatzemades als ‘daterecords’ de la taula Hbase mitjançant l’ordre scan.

Rebrà les dades tal i com es mostra a la imatge següent.

Ara hem inserit les dades a la taula HBase amb èxit.

Recuperem els registres emmagatzemats a la taula d'una data concreta.

En aquest cas d’ús, estem intentant recuperar els registres de la data: 15thMarç de 2014

Per recuperar els registres hem creat un mètode

getAllRecord (String tableName, String startPartialKey, String endPartialKey)

El primer paràmetre representa el nom de la taula, el segon representa la data d'inici a partir de la qual hem de recuperar les dades i el tercer és la data següent de la data d'inici.

Per exemple:

getAllRecord (tableName, '20140315', '20140316')

Ara entenem el lògica d’aquest mètode.

Intentem escanejar la taula Hbase mitjançant l'API HBase amb l'ajuda de startPartialKey i endPartialKey.

Com que StartPartialKey i endPartialkey no són nuls, passarà a bloquejar i escanejar els registres que tinguin el valor de startPartialKey.

Hem creat un objecte de l’escàner de resultats que emmagatzema els registres escanejats de la taula Hbase i un HashMap per emmagatzemar la sortida que resultarà.

Estem creant un objecte de Resultat per obtenir el magatzem de dades a l’escàner de resultats i executem un bucle for.

imsi és la cadena que es defineix per emmagatzemar el número de mòbil i keyVal és un mapa hash que emmagatzema la sortida recuperada de la columna d'un telèfon concret.

Hem donat 20.140.315-1234567890 com el clau de fila a la taula Hbase. En aquest 20140315 representa la data i 1234567890 representa el número de mòbil.

Com que només necessitem el número de mòbil, estem utilitzant el mètode de subcadena per recuperar-lo.

Recuperem les dades del r.raw () i les emmagatzemem al HashMap mitjançant Put.

Finalment, estem intentant imprimir-los a la consola.

La sortida serà com a la imatge següent.

Hem recuperat amb èxit els registres de la data: 15thMarç de 2014.