De tweede instructie in een serie over het gebruik van de Apache HBase Thrift API
De vorige keer hebben we de basis besproken over verbinding maken met Thrift via Python. Deze keer leer je hoe je meerdere rijen tegelijk kunt invoegen en ophalen.
Werken met tabellen
Met behulp van de Thrift-interface kunt u tabellen maken of verwijderen. Laten we eens kijken naar de Python-code die een tabel maakt:
client.createTable(tablename, [Hbase.ColumnDescriptor(name=cfname)])
In dit fragment hebt u een Hbase.ColumnDescriptor-object gemaakt. In dit object kunt u alle verschillende parameters voor een kolomfamilie instellen. In dit geval stelt u alleen de Kolomfamilienaam in.
U herinnert zich misschien uit de vorige how-to dat het vaak handig is om het Hbase.thrift-bestand aan uw project toe te voegen. Dit is een van die keren:u kunt Hbase.thrift openen en de ColumnDescriptor-definitie vinden met al zijn parameters en hun namen.
U kunt bevestigen dat een tabel bestaat met de volgende code:
tables = client.getTableNames() found = False for table in tables: if table == tablename: found = True
Deze code haalt een lijst op van de gebruikerstabellen, doorloopt ze en markeert als waar als de tabel wordt gevonden.
U kunt een tabel verwijderen met de volgende code:
client.disableTable(tablename) client.deleteTable(tablename)
Onthoud dat u in HBase een tabel moet uitschakelen voordat u deze verwijdert. Deze code doet precies dat.
Rijen toevoegen met Thrift
Thrift biedt ons een aantal manieren om rijen toe te voegen of bij te werken:één rij tegelijk of meerdere rijen tegelijk. De Thrift-interface gebruikt niet hetzelfde Put-object als de Java API. Deze wijzigingen worden rijmutaties genoemd en gebruiken de objecten Mutation en BatchMutation.
mutations = [Hbase.Mutation( column='columnfamily:columndescriptor', value='columnvalue')] client.mutateRow('tablename', 'rowkey', mutations)
Elk Mutatie-object vertegenwoordigt de wijzigingen in een enkele kolom. Om nog een kolom toe te voegen of te wijzigen, voegt u gewoon een ander Mutatie-object toe aan de mutatielijst.
Wanneer u klaar bent met het toevoegen van Mutation-objecten, roept u de mutateRow-methode aan. Deze methode neemt de tabelnaam, rijsleutel en mutatielijst als argumenten.
Het toevoegen van meerdere rijen tegelijk vereist een paar wijzigingen:
# 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 dit voorbeeld gebruik je nog steeds het Mutation-object, maar deze keer moet je ze in een BatchMutation-object inpakken. Met het BatchMutation-object kunt u een andere rijsleutel opgeven voor elke lijst met mutaties. U gaat ook over op de methode muterenRows. Er is een tabelnaam voor nodig en het BatchMutation-object.
Rijen krijgen met spaarzaamheid
Met behulp van de getRow-methode kunt u een enkele rij ophalen op basis van de rijsleutel. Deze aanroep retourneert een lijst met TRowResult-objecten. Hier is de code om de uitvoer te krijgen en ermee te werken:
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
Start de code met een getRow-verzoek. Deze get retourneert de rij met de sleutel "shakespeare-comedies-000001". Deze rijen komen terug als een lijst met TRowResult. Met behulp van een rijlus doorloopt u de lijst met rijen die zijn geretourneerd.
Om de waarde van een kolom te krijgen, gebruikt u columns.get(“COLUMNFAMILY:COLUMDESCRIPTOR”). Zorg ervoor dat u de juiste naamgevingssyntaxis gebruikt.
Onthoud dat wanneer u met binaire gegevens werkt, zoals gehele getallen, u deze moet converteren van een Python-tekenreeks naar welk type dan ook. In dit geval neem je de string en maak je er een geheel getal van met de decodeermethode.
Meerdere rijen tegelijk krijgen lijkt erg op het krijgen van één rij. Hier is de code:
rowKeys = [ "shakespeare-comedies-000001", "shakespeare-comedies-000010", "shakespeare-comedies-000020", "shakespeare-comedies-000100", "shakespeare-comedies-000201" ] rows = client.getRows(tablename, rowKeys)
In plaats van een enkele rij op te geven, geeft u een lijst met rijen door. Je verandert ook de methode in getRows, die de tabelnaam en lijst met rijen als argumenten gebruikt.
Er wordt een lijst met TRowResult-objecten geretourneerd en u doorloopt de lijst, net als in de code met één rij.
In de volgende en laatste instructie leert u hoe u scans gebruikt en krijgt u een inleiding tot enkele overwegingen bij het kiezen tussen de REST- en Thrift-API's voor ontwikkeling.
Jesse Anderson is een instructeur voor Cloudera University.