Hướng dẫn thứ hai trong loạt bài về cách sử dụng API tiết kiệm Apache HBase
Lần trước, chúng tôi đã đề cập đến các nguyên tắc cơ bản về kết nối với Thrift qua Python. Lần này, bạn sẽ học cách chèn và lấy nhiều hàng cùng một lúc.
Làm việc với Bảng
Sử dụng giao diện Tiết kiệm, bạn có thể tạo hoặc xóa bảng. Hãy xem mã Python tạo bảng:
client.createTable(tablename, [Hbase.ColumnDescriptor(name=cfname)])
Trong đoạn mã này, bạn đã tạo một đối tượng Hbase.ColumnDescriptor. Trong đối tượng này, bạn có thể đặt tất cả các tham số khác nhau cho một Họ cột. Trong trường hợp này, bạn chỉ đặt tên Họ Cột.
Bạn có thể nhớ lại từ hướng dẫn trước rằng việc thêm tệp Hbase.thrift vào dự án của bạn thường hữu ích. Đây là một trong những thời điểm đó:Bạn có thể mở Hbase.thrift và tìm định nghĩa ColumnDescriptor với tất cả các tham số và tên của chúng.
Bạn có thể xác nhận một bảng tồn tại bằng mã sau:
tables = client.getTableNames() found = False for table in tables: if table == tablename: found = True
Mã này lấy danh sách các bảng của người dùng, lặp lại qua chúng và đánh dấu là đúng nếu tìm thấy bảng.
Bạn có thể xóa bảng bằng mã sau:
client.disableTable(tablename) client.deleteTable(tablename)
Hãy nhớ rằng trong HBase, bạn phải vô hiệu hóa một bảng trước khi xóa nó. Mã này thực hiện điều đó.
Thêm hàng với tiết kiệm
Thrift cung cấp cho chúng tôi một số cách để thêm hoặc cập nhật hàng:Một hàng tại một thời điểm hoặc nhiều hàng cùng một lúc. Giao diện Thrift không sử dụng đối tượng Đặt giống như API Java. Những thay đổi này được gọi là đột biến hàng và sử dụng các đối tượng Mutation và BatchMutation.
mutations = [Hbase.Mutation( column='columnfamily:columndescriptor', value='columnvalue')] client.mutateRow('tablename', 'rowkey', mutations)
Mỗi đối tượng Mutation đại diện cho các thay đổi đối với một cột duy nhất. Để thêm hoặc thay đổi một cột khác, bạn chỉ cần thêm một đối tượng Đột biến khác vào danh sách đột biến.
Khi bạn hoàn tất việc thêm các đối tượng Mutation, bạn gọi phương thức mutateRow. Phương thức này lấy tên bảng, khóa hàng và danh sách đột biến làm đối số.
Việc thêm nhiều hàng cùng một lúc yêu cầu một số thay đổi:
# 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)
Trong ví dụ này, bạn vẫn đang sử dụng đối tượng Mutation nhưng lần này bạn phải bọc chúng trong một đối tượng BatchMutation. Đối tượng BatchMutation cho phép bạn chỉ định một phím hàng khác nhau cho mỗi danh sách các Đột biến. Bạn cũng thay đổi phương thức mutateRows. Nó có tên bảng và đối tượng BatchMutation.
Lên hàng với tiết kiệm
Sử dụng phương thức getRow, bạn có thể truy xuất một hàng dựa trên khóa hàng của nó. Lời gọi này trả về một danh sách các đối tượng TRowResult. Đây là mã để nhận và làm việc với đầu ra:
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
Bắt đầu mã với một yêu cầu getRow. Giá trị nhận được này sẽ trả về hàng có khóa “shakespeare -edyies-000001”. Các hàng này sẽ trở lại dưới dạng danh sách TRowResult. Sử dụng vòng lặp hàng, bạn xem qua danh sách các hàng đã được trả về.
Để nhận giá trị của một cột, hãy sử dụng column.get (“COLUMNFAMILY:COLUMDESCRIPTOR”). Đảm bảo sử dụng cú pháp đặt tên thích hợp.
Hãy nhớ rằng khi xử lý dữ liệu nhị phân như số nguyên, bạn sẽ cần chuyển đổi nó từ một chuỗi Python sang bất kỳ kiểu nào. Trong trường hợp này, bạn đang lấy chuỗi và biến nó thành số nguyên bằng phương thức giải mã.
Nhận nhiều hàng cùng một lúc cũng tương tự như nhận một hàng. Đây là mã:
rowKeys = [ "shakespeare-comedies-000001", "shakespeare-comedies-000010", "shakespeare-comedies-000020", "shakespeare-comedies-000100", "shakespeare-comedies-000201" ] rows = client.getRows(tablename, rowKeys)
Thay vì chỉ định một hàng, bạn chuyển vào danh sách các hàng. Bạn cũng thay đổi phương thức thành getRows, phương thức này lấy tên bảng và danh sách các hàng làm đối số.
Một danh sách các đối tượng TRowResult được trả về và sau đó bạn lặp lại danh sách giống như trong mã một hàng.
Trong cách thực hiện tiếp theo và cuối cùng, bạn sẽ học cách sử dụng quét và được giới thiệu về một số cân nhắc khi lựa chọn giữa API REST và Thrift để phát triển.
Jesse Anderson là giảng viên của Đại học Cloudera.