Drugie instrukcje z serii dotyczące korzystania z interfejsu API Apache HBase Thrift
Ostatnim razem omówiliśmy podstawy łączenia się z Thrift przez Pythona. Tym razem dowiesz się, jak wstawiać i pobierać wiele wierszy naraz.
Praca z tabelami
Korzystając z interfejsu Thrift, możesz tworzyć lub usuwać tabele. Rzućmy okiem na kod Pythona, który tworzy tabelę:
client.createTable(tablename, [Hbase.ColumnDescriptor(name=cfname)])
W tym fragmencie utworzono obiekt Hbase.ColumnDescriptor. W tym obiekcie możesz ustawić wszystkie różne parametry dla Rodziny Kolumn. W takim przypadku ustawiasz tylko nazwę rodziny kolumn.
Być może pamiętasz z poprzedniego poradnika, że dodanie pliku Hbase.thrift do projektu jest często przydatne. To jest jeden z tych przypadków:możesz otworzyć Hbase.thrift i znaleźć definicję ColumnDescriptor ze wszystkimi jej parametrami i ich nazwami.
Możesz potwierdzić, że tabela istnieje, używając następującego kodu:
tables = client.getTableNames() found = False for table in tables: if table == tablename: found = True
Ten kod pobiera listę tabel użytkowników, przechodzi przez nie i oznacza, że znaleziono je jako prawdziwe, jeśli tabela została znaleziona.
Możesz usunąć tabelę za pomocą następującego kodu:
client.disableTable(tablename) client.deleteTable(tablename)
Pamiętaj, że w HBase musisz wyłączyć tabelę przed jej usunięciem. Ten kod właśnie to robi.
Dodawanie wierszy za pomocą oszczędności
Thrift daje nam kilka sposobów dodawania lub aktualizowania wierszy: jeden wiersz na raz lub wiele wierszy naraz. Interfejs Thrift nie korzysta z tego samego obiektu Put, co Java API. Te zmiany są nazywane mutacjami wierszy i wykorzystują obiekty Mutation i BatchMutation.
mutations = [Hbase.Mutation( column='columnfamily:columndescriptor', value='columnvalue')] client.mutateRow('tablename', 'rowkey', mutations)
Każdy obiekt Mutation reprezentuje zmiany w jednej kolumnie. Aby dodać lub zmienić inną kolumnę, wystarczy dodać kolejny obiekt Mutation do listy mutacji.
Po zakończeniu dodawania obiektów Mutation wywołujesz metodę mutateRow. Ta metoda przyjmuje nazwę tabeli, klucz wiersza i listę mutacji jako argumenty.
Dodanie wielu wierszy naraz wymaga kilku zmian:
# 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)
W tym przykładzie nadal używasz obiektu Mutation, ale tym razem musisz owinąć je w obiekt BatchMutation. Obiekt BatchMutation umożliwia określenie innego klucza wiersza dla każdej listy mutacji. Zmieniasz się również na metodę mutateRows. Pobiera nazwę tabeli i obiekt BatchMutation.
Zbieranie rzędów z oszczędnością
Używając metody getRow, możesz pobrać pojedynczy wiersz na podstawie jego klucza wiersza. To wywołanie zwraca listę obiektów TRowResult. Oto kod do pobierania i pracy z danymi wyjściowymi:
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
Rozpocznij kod od żądania getRow. To pobranie zwróci wiersz z kluczem „komedia szekspirowska-000001”. Te wiersze powrócą jako lista TRowResult. Używając pętli wierszy, przechodzisz przez listę zwróconych wierszy.
Aby uzyskać wartość kolumny, użyj kolumny.get(„COLUMNFAMILY:COLUMDESCRIPTOR”). Upewnij się, że używasz właściwej składni nazewnictwa.
Pamiętaj, że kiedy masz do czynienia z danymi binarnymi, takimi jak liczby całkowite, będziesz musiał przekonwertować je z ciągu Pythona na dowolny typ. W tym przypadku bierzesz łańcuch i zmieniasz go w liczbę całkowitą za pomocą metody dekodowania.
Uzyskiwanie wielu wierszy naraz jest bardzo podobne do uzyskiwania jednego wiersza. Oto kod:
rowKeys = [ "shakespeare-comedies-000001", "shakespeare-comedies-000010", "shakespeare-comedies-000020", "shakespeare-comedies-000100", "shakespeare-comedies-000201" ] rows = client.getRows(tablename, rowKeys)
Zamiast określać pojedynczy wiersz, przekazujesz listę wierszy. Zmieniasz również metodę na getRows, która jako argumenty przyjmuje nazwę tabeli i listę wierszy.
Zwracana jest lista obiektów TRowResult, a następnie przechodzisz przez listę, tak jak w kodzie jednowierszowym.
W następnym i ostatnim poradniku dowiesz się, jak korzystać ze skanów i zapoznasz się z niektórymi kwestiami dotyczącymi wyboru między interfejsami API REST i Thrift do programowania.
Jesse Anderson jest wykładowcą na Uniwersytecie Cloudera.