HBase
 sql >> Datenbank >  >> NoSQL >> HBase

How-to:Verwenden der HBase Thrift-Schnittstelle, Teil 2:Zeilen einfügen/erhalten

Die zweite Anleitung in einer Reihe über die Verwendung der Apache HBase Thrift API

Letztes Mal haben wir die Grundlagen zur Verbindung mit Thrift über Python behandelt. Dieses Mal lernen Sie, wie Sie mehrere Zeilen gleichzeitig einfügen und abrufen.

Mit Tabellen arbeiten

Mit der Thrift-Oberfläche können Sie Tabellen erstellen oder löschen. Werfen wir einen Blick auf den Python-Code, der eine Tabelle erstellt:

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

In diesem Codeausschnitt haben Sie ein Hbase.ColumnDescriptor-Objekt erstellt. In diesem Objekt können Sie alle verschiedenen Parameter für eine Stützenfamilie einstellen. In diesem Fall legen Sie nur den Namen der Spaltenfamilie fest.

Sie erinnern sich vielleicht an die vorherige Anleitung, dass das Hinzufügen der Datei Hbase.thrift zu Ihrem Projekt oft nützlich ist. Dies ist einer dieser Fälle:Sie können Hbase.thrift öffnen und die ColumnDescriptor-Definition mit all ihren Parametern und ihren Namen finden.

Mit dem folgenden Code können Sie bestätigen, dass eine Tabelle vorhanden ist:

tables = client.getTableNames()

found = False

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

Dieser Code ruft eine Liste der Benutzertabellen ab, durchläuft sie und markiert gefunden als wahr, wenn die Tabelle gefunden wird.

Sie können eine Tabelle mit dem folgenden Code löschen:

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

Denken Sie daran, dass Sie in HBase eine Tabelle deaktivieren müssen, bevor Sie sie löschen können. Dieser Code macht genau das.

Zeilen mit Sparsamkeit hinzufügen

Thrift bietet uns mehrere Möglichkeiten, Zeilen hinzuzufügen oder zu aktualisieren: Eine Zeile nach der anderen oder mehrere Zeilen gleichzeitig. Die Thrift-Schnittstelle verwendet nicht dasselbe Put-Objekt wie die Java-API. Diese Änderungen werden Zeilenmutationen genannt und verwenden die Objekte Mutation und BatchMutation.

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

Jedes Mutationsobjekt repräsentiert die Änderungen an einer einzelnen Spalte. Um eine weitere Spalte hinzuzufügen oder zu ändern, fügen Sie einfach ein weiteres Mutationsobjekt zur Mutationsliste hinzu.

Wenn Sie mit dem Hinzufügen von Mutation-Objekten fertig sind, rufen Sie die mutateRow-Methode auf. Diese Methode nimmt den Tabellennamen, den Zeilenschlüssel und die Mutationsliste als Argumente.

Das gleichzeitige Hinzufügen mehrerer Zeilen erfordert einige Änderungen:

# 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)
aus

In diesem Beispiel verwenden Sie immer noch das Mutation-Objekt, aber dieses Mal müssen Sie sie in ein BatchMutation-Objekt einschließen. Mit dem BatchMutation-Objekt können Sie für jede Liste von Mutationen einen anderen Zeilenschlüssel angeben. Sie wechseln auch zur mutateRows-Methode. Es nimmt einen Tabellennamen und das BatchMutation-Objekt an.

Mit Sparsamkeit Reihen bekommen

Mit der getRow-Methode können Sie eine einzelne Zeile basierend auf ihrem Zeilenschlüssel abrufen. Dieser Aufruf gibt eine Liste von TRowResult-Objekten zurück. Hier ist der Code zum Abrufen und Arbeiten mit der Ausgabe:

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

Starten Sie den Code mit einer getRow-Anfrage. Dieser Abruf gibt die Zeile mit dem Schlüssel „shakespeare-comedies-000001“ zurück. Diese Zeilen werden als Liste von TRowResult zurückgegeben. Mit einer Zeilenschleife gehen Sie die Liste der zurückgegebenen Zeilen durch.

Um den Wert einer Spalte abzurufen, verwenden Sie Columns.get(“COLUMNFAMILY:COLUMDESCRIPTOR”). Achten Sie darauf, die richtige Namenssyntax zu verwenden.

Denken Sie daran, dass Sie beim Umgang mit Binärdaten wie Ganzzahlen diese von einem Python-String in den gewünschten Typ konvertieren müssen. In diesem Fall nehmen Sie den String und machen ihn mit der decode-Methode zu einer Ganzzahl.

Das gleichzeitige Abrufen mehrerer Zeilen ist dem Abrufen einer Zeile sehr ähnlich. Hier ist der Code:

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

rows = client.getRows(tablename, rowKeys)

Anstatt eine einzelne Zeile anzugeben, übergeben Sie eine Liste von Zeilen. Sie ändern auch die Methode in getRows, die den Tabellennamen und die Liste der Zeilen als Argumente verwendet.

Eine Liste von TRowResult-Objekten wird zurückgegeben, und Sie iterieren dann durch die Liste, genau wie im einzeiligen Code.

In der nächsten und letzten Anleitung erfahren Sie, wie Sie Scans verwenden, und erhalten eine Einführung in einige Überlegungen zur Auswahl zwischen den REST- und Thrift-APIs für die Entwicklung.

Jesse Anderson ist Dozent an der Cloudera University.