9

HBase で複数の行を削除する効率的な方法はありますか? または、私のユース ケースは HBase に適していないように思えますか?

チャートに含まれるアイテムを含む「チャート」というテーブルがあります。行キーの形式は次のとおりです。 chart|date_reversed|ranked_attribute_value_reversed|content_id

特定の日付のグラフを再生成したい場合があるため、「chart|date_reversed_1」から「chart|date_reversed_2」までのすべての行を削除したいと考えています。Scan で見つかった行ごとに Delete を発行するよりも良い方法はありますか? 削除されるすべての行は、互いに近くなります。

行を削除する必要があるのは、1 つのアイテム (1 つの content_id) に複数のエントリを持たせたくないためです。

私は HBase の初心者なので、行を間違って使用しているのかもしれませんが、列の方が優れているかもしれません。それとも、グラフをファイルで生成したほうがよいのでしょうか (出力用の HBase がないなど)。MapReduce を使用しています。

4

3 に答える 3

7

まず、範囲削除のポイントに到達すると、HBase、AFAIKにはまだ範囲削除がありません。ただし、 HTableInterfaceAPIで一度に複数の行を削除する方法があります。このためには、スキャンからの行キーを使用してDeleteオブジェクトを作成し、それらをリストに入れてAPIを使用します。スキャンを高速化するには、行全体を削除するための行キーだけが必要なので、スキャン結果に列ファミリーを含めないでください。

第二に、デザインについて。最初に要件を理解したのは、コンテンツIDを持つコンテンツがあり、各コンテンツにはそれらに対して生成されたグラフがあり、それらのデータが保存されているということです。日付を介してコンテンツごとに複数のグラフが存在する可能性があり、ランクによって異なります。さらに、最後に生成されたコンテンツのチャートをテーブルの上部に表示する必要があります。

要件を想定するために、auto_id、content_charts、generated_orderの3つのテーブルを使用することをお勧めします。content_chartsの行キーはそのコンテンツIDであり、generated_orderの行キーはlongであり、HTableInterfaceAPIを使用して自動デクリメントされます。デクリメントするには、アプリの最初の起動時または手動で、auto_idテーブルの値Long.MAX_VALUEをオフセットして初期化する量として「-1」を使用します。したがって、グラフデータを削除する場合は、deleteを使用して列ファミリーをクリーンアップするだけです次に、新しいデータを元に戻し、generated_orderテーブルに配置します。このようにして、最新の挿入は、コンテンツIDをセル値として保持する最新の挿入テーブルの一番上にも表示されます。生成されたorderがコンテンツごとに1つのエントリのみを持つようにする場合は、最初にgenerated_order IDを保存し、値を取得してcontent_chartsに保存します。列ファミリーを削除する前に、最初にgenerated_orderから行を削除します。このようにして、最大2つのgetを使用してコンテンツを検索し、グラフを作成できます。グラフをスキャンする必要はありません。

これがお役に立てば幸いです。

于 2011-01-07T06:43:54.237 に答える
2

関連する範囲 (開始行、終了行、フィルター) を定義する Scan を使用する BulkDeleteProtocol を使用できます。

こちらをご覧ください

于 2014-02-18T15:16:35.270 に答える