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

Anleitung:Verwenden Sie die Apache HBase REST-Schnittstelle, Teil 3

Diese Anleitung ist die dritte in einer Reihe, in der die Verwendung der Apache HBase REST-Schnittstelle untersucht wird. Teil 1 behandelte HBase-REST-Grundlagen, einige Python-Vorbehalte und Tabellenverwaltung. Teil 2 hat Ihnen gezeigt, wie Sie mehrere Zeilen gleichzeitig mit XML und JSON einfügen. Teil 3 unten zeigt, wie man mehrere Zeilen mit XML und JSON erhält.

Zeilen mit XML abrufen

Mit einem GET Verb können Sie eine einzelne Zeile oder eine Gruppe von Zeilen basierend auf ihren Zeilenschlüsseln abrufen. (Weitere Informationen zum mehrwertigen URL-Format finden Sie hier.) Hier verwenden wir das einfache Platzhalterzeichen oder Sternchen (*), um alle Zeilen abzurufen, die mit einer bestimmten Zeichenfolge beginnen. In diesem Beispiel können wir jede Zeile von Shakespeares Komödien mit „shakespeare-comedies-*“ laden. Dies erfordert auch, dass unsere Zeilenschlüssel nach „AUTHOR-WORK-LINENUMBER“ ausgelegt sind.

Hier ist der Code zum Abrufen und Arbeiten mit der XML-Ausgabe:

request = requests.get(baseurl + "/" + tablename + "/shakespeare-comedies-*", headers={"Accept" : "text/xml"})

root = fromstring(request.text)

# Go through every row passed back
for row in root:
     message = ''
     linenumber = 0
     username = ''
    
     # Go through every cell in the row
     for cell in row:
          columnname = base64.b64decode(cell.get('column'))

          if cell.text == None:
               continue
    
          if columnname == cfname + ":" + messagecolumn:
               message = base64.b64decode(cell.text)
          elif columnname == cfname + ":" + linenumbercolumn:
               linenumber = decode(cell.text)
          elif columnname == cfname + ":" + usernamecolumn:
               username = base64.b64decode(cell.text)

     rowKey = base64.b64decode(row.get('key'))

Wir beginnen den Code mit einem get Anfrage. Diese get wird alle Zeilen in Shakespeares Komödien zurückgeben. Diese Zeilen werden aufgrund der Änderung an Accept als XML zurückgegeben Kopfzeile.

Dann nehmen wir das von der Anfrage zurückgegebene XML und verwandeln es in ein XML-DOM. Jede Zeile von HBase befindet sich in einem separaten Zeilenelement. Wir verwenden einen for Schleife, um jede Zeile zu durchlaufen.

Jede Zelle in der Zeile ist ein separates XML-Element. Wir verwenden einen anderen for Schleife, um alle diese Zellen zu durchlaufen. (Dieser Codeblock könnte einfacher gemacht werden, indem XPath verwendet wird, um die richtigen Elemente zu finden.) Wenn jede Spalte gefunden wird, wird der Wert in einer Variablen gespeichert. (Die Dekodierungsmethode wird in Teil 1 dieser Serie besprochen.) Alle Werte, die in XML zurückkommen, sind base64-kodiert und müssen dekodiert werden, bevor sie verwendet werden können.

Schließlich wird der Zeilenschlüssel abgerufen und dekodiert.

Sobald alle Daten gefunden und entschlüsselt sind, können Sie mit der Verwendung beginnen. Ihr Code würde nach dem Decodieren der Zeile beginnen. Denken Sie daran, dass einige dieser Variablen nicht dekodiert werden müssen – ich mache sie hier alle der Vollständigkeit halber.

Zeilen mit JSON abrufen

Das Arbeiten mit JSON ist genau wie das Arbeiten mit XML:Verwenden eines get  Verb können Sie eine einzelne Zeile oder eine Gruppe von Zeilen basierend auf ihrem Zeilenschlüssel abrufen.

Hier ist der Code zum Abrufen und Arbeiten mit der JSON-Ausgabe:

request = requests.get(baseurl + "/" + tablename + "/shakespeare-comedies-*", headers={"Accept" : "application/json"})

bleats = json.loads(request.text)

for row in bleats['Row']:
     message = ''
     lineNumber = 0
     username = ''

     for cell in row['Cell']:
          columnname = base64.b64decode(cell['column'])
          value = cell['$']
         
          if value == None:
               continue

          if columnname == cfname + ":" + messagecolumn:
               message = base64.b64decode(value)
          elif columnname == cfname + ":" + linenumbercolumn:
               lineNumber = decode(str(value))
          elif columnname == cfname + ":" + usernamecolumn:
               username = base64.b64decode(value)

     rowKey = base64.b64decode(row['key'])

Wir beginnen den Code mit einem get Anfrage, die alle Zeilen in Shakespeares Komödien zurückgibt. Diese Zeilen werden aufgrund der Änderung an Accept als JSON zurückgegeben Kopfzeile.

Dann nehmen wir das von der Anfrage zurückgegebene JSON und wandeln es in ein JSON-Objekt um. Jede Zeile von HBase befindet sich in einem separaten Index im Zeilenarray. Wir verwenden einen for Schleife, um jede Zeile zu durchlaufen.

Jede Zelle in der Zeile ist ein separater Array-Index. Wir verwenden einen anderen for Schleife, um alle diese Zellen zu durchlaufen. Wenn jede Spalte gefunden wird, wird der Wert in einer Variablen gespeichert. Alle Werte, die in JSON zurückkommen, sind base64-kodiert und müssen dekodiert werden, bevor sie verwendet werden. (Auch hier wird die Dekodierungsmethode in Teil 1 dieser Serie besprochen.) Beachten Sie, dass die Werte im Eintrag mit dem Dollarzeichen ($) zurückgegeben werden.

Schließlich wird der Zeilenschlüssel abgerufen und dekodiert.

Sobald alle Daten gefunden und entschlüsselt sind, können Sie damit beginnen, sie zu verwenden.

Curl verwenden

Wie in der Dokumentation zur REST-Schnittstelle gezeigt, können Sie mit curl XML oder JSON direkt an die Konsole ausgeben. Zum Beispiel könnten Sie das Gleiche tun, wie wir es gerade getan haben, indem Sie curl verwenden. Der Befehl lautet:

curl -H "Accept: text/xml" http://localhost:8070/tablename/shakespeare-comedies-*

Dieser Befehl würde Ihnen die XML-Ausgabe geben. Um die JSON-Ausgabe zu erhalten, lautet der Befehl:

curl -H "Accept: application/json" http://localhost:8070/tablename/shakespeare-comedies-*

Mit Befehlen wie diesen können Sie schnell sehen, was zurückkommt oder wie die Daten aussehen. Sie können curl verwenden, um den Statuscode eines REST-Aufrufs anzuzeigen mit:

[user@localhost HBaseREST]$ curl -I -H "Accept: text/xml" http://localhost:8070/messagestable/shakespeare-comedies-*
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/xml

Schlussfolgerung

Die HBase-REST-Schnittstelle ist eine gute Möglichkeit, HBase zu verwenden, wenn Sie Java nicht verwenden möchten. Es bietet Ihnen eine vertraute REST-Schnittstelle, die in viele Sprachen integriert ist, sowie ein vertrautes Datenformat.

Hoffentlich ersparen Ihnen die Codebeispiele und Erläuterungen in dieser Reihe viel Googlen, wenn Sie mit Ihrem RESTful-HBase-Projekt beginnen.

Jesse Anderson ist Dozent an der Cloudera University.