Apache HBaseThriftAPIの使用に関するシリーズの2番目のハウツー
前回は、Pythonを介したThriftへの接続に関する基本事項について説明しました。今回は、一度に複数の行を挿入して取得する方法を学習します。
テーブルの操作
Thriftインターフェースを使用して、テーブルを作成または削除できます。テーブルを作成するPythonコードを見てみましょう:
client.createTable(tablename, [Hbase.ColumnDescriptor(name=cfname)])
このスニペットでは、Hbase.ColumnDescriptorオブジェクトを作成しました。このオブジェクトでは、列ファミリのさまざまなパラメータをすべて設定できます。この場合、列ファミリー名のみを設定します。
以前のハウツーから、プロジェクトにHbase.thriftファイルを追加すると便利なことがよくあることを思い出してください。これはそのような場合の1つです。Hbase.thriftを開いて、すべてのパラメーターとその名前を含むColumnDescriptor定義を見つけることができます。
次のコードを使用して、テーブルが存在することを確認できます。
tables = client.getTableNames() found = False for table in tables: if table == tablename: found = True
このコードは、ユーザーテーブルのリストを取得し、それらを繰り返し処理し、テーブルが見つかった場合にtrueとしてマークを付けます。
次のコードを使用してテーブルを削除できます:
client.disableTable(tablename) client.deleteTable(tablename)
HBaseでは、テーブルを削除する前にテーブルを無効にする必要があることに注意してください。このコードはまさにそれを行います。
Thriftを使用した行の追加
Thriftには、行を追加または更新する方法がいくつかあります。一度に1行、または一度に複数の行です。 Thriftインターフェースは、JavaAPIと同じPutオブジェクトを使用しません。これらの変更は行ミューテーションと呼ばれ、MutationオブジェクトとBatchMutationオブジェクトを使用します。
mutations = [Hbase.Mutation( column='columnfamily:columndescriptor', value='columnvalue')] client.mutateRow('tablename', 'rowkey', mutations)
各Mutationオブジェクトは、単一の列への変更を表します。別の列を追加または変更するには、ミューテーションリストに別のMutationオブジェクトを追加するだけです。
Mutationオブジェクトの追加が完了したら、mutateRowメソッドを呼び出します。このメソッドは、テーブル名、行キー、およびミューテーションリストを引数として取ります。
一度に複数の行を追加するには、いくつかの変更が必要です。
# 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)
この例では、まだMutationオブジェクトを使用していますが、今回はそれらをBatchMutationオブジェクトでラップする必要があります。 BatchMutationオブジェクトを使用すると、ミューテーションのリストごとに異なる行キーを指定できます。また、mutateRowsメソッドに変更します。テーブル名とBatchMutationオブジェクトを取ります。
倹約で行を取得する
getRowメソッドを使用すると、行キーに基づいて単一の行を取得できます。この呼び出しは、TRowResultオブジェクトのリストを返します。出力を取得して操作するためのコードは次のとおりです。
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
getRowリクエストでコードを開始します。このgetは、キー「shakespeare-comedies-000001」の行を返します。これらの行は、TRowResultのリストとして返されます。行ループを使用して、返された行のリストを調べます。
列の値を取得するには、columns.get(“ COLUMNFAMILY:COLUMDESCRIPTOR”)を使用します。必ず適切な命名構文を使用してください。
整数などのバイナリデータを処理する場合は、Python文字列から必要なタイプに変換する必要があることに注意してください。この場合、文字列を取得し、decodeメソッドを使用して整数にします。
一度に複数の行を取得することは、1つの行を取得することと非常に似ています。コードは次のとおりです:
rowKeys = [ "shakespeare-comedies-000001", "shakespeare-comedies-000010", "shakespeare-comedies-000020", "shakespeare-comedies-000100", "shakespeare-comedies-000201" ] rows = client.getRows(tablename, rowKeys)
単一の行を指定する代わりに、行のリストを渡します。また、メソッドをgetRowsに変更します。これは、テーブル名と行のリストを引数として取ります。
TRowResultオブジェクトのリストが返され、単一行のコードと同じようにリストを反復処理します。
次の最後のハウツーでは、スキャンの使用方法を学び、開発用にRESTAPIとThriftAPIのどちらかを選択する際の考慮事項を紹介します。
ジェシーアンダーソンはCloudera大学のインストラクターです。