HBase
 sql >> Database >  >> NoSQL >> HBase

Procedura:utilizzare l'interfaccia dell'usato HBase, parte 2:inserimento/ottenimento di righe

Il secondo how-to di una serie sull'utilizzo dell'API Thrift Apache HBase

L'ultima volta, abbiamo trattato i fondamenti sulla connessione a Thrift tramite Python. Questa volta imparerai come inserire e ottenere più righe alla volta.

Lavorare con le tabelle

Utilizzando l'interfaccia Thrift, puoi creare o eliminare tabelle. Diamo un'occhiata al codice Python che crea una tabella:

client.createTable(tablename, [Hbase.ColumnDescriptor(name=cfname)])

In questo frammento di codice è stato creato un oggetto Hbase.ColumnDescriptor. In questo oggetto è possibile impostare tutti i diversi parametri per una famiglia di colonne. In questo caso, imposti solo il nome della famiglia di colonne.

Potresti ricordare dalla procedura precedente che l'aggiunta del file Hbase.thrift al tuo progetto è spesso utile. Questa è una di quelle volte:puoi aprire Hbase.thrift e trovare la definizione ColumnDescriptor con tutti i suoi parametri e i loro nomi.

Puoi confermare l'esistenza di una tabella utilizzando il seguente codice:

tables = client.getTableNames()

found = False

for table in tables:
	if table == tablename:
		found = True

Questo codice ottiene un elenco delle tabelle utente, le scorre e contrassegna come true se la tabella viene trovata.

Puoi eliminare una tabella utilizzando il seguente codice:

client.disableTable(tablename)
client.deleteTable(tablename)

Ricorda che in HBase devi disabilitare una tabella prima di eliminarla. Questo codice fa proprio questo.

Aggiunta di righe con parsimonia

Thrift ci offre un paio di modi per aggiungere o aggiornare righe: Una riga alla volta o più righe alla volta. L'interfaccia Thrift non utilizza lo stesso oggetto Put dell'API Java. Queste modifiche sono chiamate mutazioni di riga e utilizzano gli oggetti Mutation e BatchMutation.

mutations = [Hbase.Mutation(
  column='columnfamily:columndescriptor', value='columnvalue')]
client.mutateRow('tablename', 'rowkey', mutations)

Ogni oggetto Mutation rappresenta le modifiche a una singola colonna. Per aggiungere o modificare un'altra colonna, devi semplicemente aggiungere un altro oggetto Mutazione all'elenco delle mutazioni.

Quando hai finito di aggiungere gli oggetti Mutation, chiami il metodo mutateRow. Questo metodo prende il nome della tabella, la chiave di riga e l'elenco delle mutazioni come argomenti.

L'aggiunta di più righe alla volta richiede alcune modifiche:

# Create a list of mutations per work of Shakespeare
mutationsbatch = []

for line in shakespeare:
	rowkey = username + "-" + filename + "-" + str(linenumber).zfill(6)

	mutations = [
			Hbase.Mutation(column=messagecolumncf, value=line.strip()),
			Hbase.Mutation(column=linenumbercolumncf, value=encode(linenumber)),
			Hbase.Mutation(column=usernamecolumncf, value=username)
		]

       mutationsbatch.append(Hbase.BatchMutation(row=rowkey,mutations=mutations))

# Run the mutations for the work of Shakespeare
client.mutateRows(tablename, mutationsbatch)

In questo esempio, stai ancora usando l'oggetto Mutation ma questa volta devi avvolgerli in un oggetto BatchMutation. L'oggetto BatchMutation consente di specificare una chiave di riga diversa per ogni elenco di mutazioni. Si passa anche al metodo mutateRows. Richiede un nome di tabella e l'oggetto BatchMutation.

Ottenere righe con parsimonia

Usando il metodo getRow, puoi recuperare una singola riga in base alla sua chiave di riga. Questa chiamata restituisce un elenco di oggetti TRowResult. Ecco il codice per ottenere e lavorare con l'output:

rows = client.getRow(tablename, "shakespeare-comedies-000001")

for row in rows:
     message = row.columns.get(messagecolumncf).value
     linenumber = decode(row.columns.get(linenumbercolumncf).value)

     rowKey = row.row

Avvia il codice con una richiesta getRow. Questo get restituirà la riga con la chiave "shakespeare-comedies-000001". Queste righe torneranno come un elenco di TRowResult. Usando un ciclo di righe, scorri l'elenco delle righe che sono state restituite.

Per ottenere il valore di una colonna, utilizzare columns.get(“COLUMNFAMILY:COLUMDESCRIPTOR”). Assicurati di utilizzare la sintassi di denominazione corretta.

Ricorda che quando hai a che fare con dati binari come numeri interi, dovrai convertirli da una stringa Python a qualsiasi tipo dovrebbe essere. In questo caso, stai prendendo la stringa e trasformandola in un intero con il metodo decode.

Ottenere più righe alla volta è molto simile a ottenere una riga. Ecco il codice:

rowKeys = [ "shakespeare-comedies-000001",
"shakespeare-comedies-000010",
"shakespeare-comedies-000020",
"shakespeare-comedies-000100",
"shakespeare-comedies-000201" ]

rows = client.getRows(tablename, rowKeys)

Invece di specificare una singola riga, si passa un elenco di righe. Puoi anche cambiare il metodo in getRows, che prende il nome della tabella e l'elenco di righe come argomenti.

Viene restituito un elenco di oggetti TRowResult e quindi si scorre l'elenco proprio come nel codice a riga singola.

Nella procedura successiva e finale imparerai come utilizzare le scansioni e avrai un'introduzione ad alcune considerazioni sulla scelta tra le API REST e Thrift per lo sviluppo.

Jesse Anderson è un istruttore per la Cloudera University.