sql >> Databasteknik >  >> NoSQL >> HBase

Så här gör du:Använd HBase Thrift Interface, del 2:Infoga/hämta rader

Den andra instruktionen i en serie om hur man använder Apache HBase Thrift API

Förra gången täckte vi grunderna om att ansluta till Thrift via Python. Den här gången får du lära dig hur du infogar och får flera rader åt gången.

Arbeta med tabeller

Med Thrift-gränssnittet kan du skapa eller ta bort tabeller. Låt oss ta en titt på Python-koden som skapar en tabell:

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

I det här utdraget skapade du ett Hbase.ColumnDescriptor-objekt. I det här objektet kan du ställa in alla olika parametrar för en kolumnfamilj. I det här fallet anger du bara kolumnfamiljens namn.

Du kanske minns från den tidigare instruktionen att det ofta är användbart att lägga till filen Hbase.thrift till ditt projekt. Det här är en av de gångerna:Du kan öppna Hbase.thrift och hitta ColumnDescriptor-definitionen med alla dess parametrar och deras namn.

Du kan bekräfta att en tabell finns med följande kod:

tables = client.getTableNames()

found = False

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

Den här koden får en lista över användartabellerna, itererar genom dem och markeras som sann om tabellen hittas.

Du kan ta bort en tabell med följande kod:

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

Kom ihåg att i HBase måste du inaktivera en tabell innan du tar bort den. Den här koden gör just det.

Lägga till rader med sparsamhet

Thrift ger oss ett par sätt att lägga till eller uppdatera rader: En rad åt gången eller flera rader åt gången. Thrift-gränssnittet använder inte samma Put-objekt som Java API. Dessa ändringar kallas radmutationer och använder objekten Mutation och BatchMutation.

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

Varje mutationsobjekt representerar ändringarna i en enda kolumn. För att lägga till eller ändra en annan kolumn lägger du helt enkelt till ett annat mutationsobjekt till mutationslistan.

När du är klar med att lägga till mutationsobjekt anropar du mutateRow-metoden. Den här metoden tar tabellnamnet, radnyckeln och mutationslistan som argument.

Att lägga till flera rader åt gången kräver några ändringar:

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

I det här exemplet använder du fortfarande Mutation-objektet men den här gången måste du slå in dem i ett BatchMutation-objekt. BatchMutation-objektet låter dig ange en annan radknapp för varje lista med mutationer. Du byter även till mutateRows-metoden. Det kräver ett tabellnamn och BatchMutation-objektet.

Få rader med sparsamhet

Genom att använda getRow-metoden kan du hämta en enskild rad baserat på dess radnyckel. Detta anrop returnerar en lista med TRowResult-objekt. Här är koden för att hämta och arbeta med utdata:

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

Starta koden med en getRow-förfrågan. Denna get kommer att returnera raden med nyckeln "shakespeare-komedier-000001". Dessa rader kommer tillbaka som en lista över TRowResult. Med hjälp av en radslinga går du igenom listan över rader som returnerades.

För att få värdet på en kolumn, använd columns.get(“COLUMNFAMILY:COLUMDESCRIPTOR”). Se till att använda rätt namnsyntax.

Kom ihåg att när du hanterar binära data som heltal, måste du konvertera den från en Python-sträng till vilken typ den ska vara. I det här fallet tar du strängen och gör den till ett heltal med avkodningsmetoden.

Att få flera rader åt gången är väldigt likt att få en rad. Här är koden:

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

rows = client.getRows(tablename, rowKeys)

Istället för att ange en enda rad, skickar du in en lista med rader. Du ändrar också metoden till getRows, som tar tabellnamnet och listan med rader som argument.

En lista med TRowResult-objekt returneras och du itererar sedan genom listan precis som i enradskoden.

I nästa och sista instruktion kommer du att lära dig hur du använder skanningar och får en introduktion till några överväganden när du väljer mellan REST och Thrift API för utveckling.

Jesse Anderson är instruktör för Cloudera University.


  1. MassTransit saga med Redis persistens ger Method Accpet har inget undantag för implementering

  2. Node.js - Session kvarstår inte genom res.redirect()

  3. C# + MongoDB - ObjectId utan att använda MongoDB DataTypes/Attributes

  4. Kan Redis skriva ut till en databas som PostgreSQL?