2017-11-08 12 views
0

(ビット単位の整数フラグや合計列のように)上書き以外のインクリメンタルに更新される列があるとします。hbaseでセルマージを実行できますか?

既存のセル:[キー: 'K1'、F1:合計:100]
Upcomming新しいセル:[キー: 'K1'、F1:合計:200(たとえば、1つだけのバージョンを想定) ]

それから私は、セルのデータをこのように更新したい:合計= 100 + 200 = 300 は、最終的な記録収量:
を[キー: 'K1'、F1:合計:300]

ここに私はしたいMERGE新しいセルを同じキーを持つ古いものに入れます。 これをどうすれば実現できますか?直接を入力してを入力すると、古いセルが単純に上書きされます。 (ここでも1つのバージョンのみが維持されます)。

私はいくつかのアイデアを思い付くが、彼らは、しかし満足のいくようではありません。最初のクライアント側で>

1を古い値は、オブジェクトを入れて行く上に合計を追加します。

2>コプロセッサを使用してください。 RegionObserver.prePutでは、最終的にを入力してオブジェクトを取得、追加、変更します。これは、計算をサーバー側にプッシュしますが、最初は余分なクエリ(get)(これは高価な可能性があります)を最初に必要とします。

リアルタイムクエリのシナリオでも上記の作業がありますが、バルクロードのデータマージはどうですか?

私はしばらくの間文書を読んできましたが、まだ手がかりを見つけることはできません。私はあなたがこれについていくつかのアイデアを共有することができれば本当に感謝します。

私はhbase-1.2.6を使用しています。ありがとう!

答えて

0

あなたのユースケースが正しく理解されていて、値が長い整数になる場合は、HBaseインクリメント操作がうまくいくはずです。詳細はIncrementのHBase 1.2.6 javadocを見てください。

算術インクリメントでない場合、HBaseにはAppendオペレーションもあります。これを使用すると、より多くのデータを既存のセルにアトミックに追加できます。

javacdocには、IncrementsとAppendが書き込みのためのアトミック性を保証しているが、読み取りは不可能であることが記載されていることに注意してください。彼らは実際に(HBase 0.95以降)読み込みのための原子性も保証していますが、これは後のリリースのドキュメントで修正されています。

また、IncrementオペレーションとAppendオペレーションの両方で追加のGet rpcを実行しません。彼らは、サーバー側で行ロックを取ってから、同じロックの下でサーバー上で書き込みを行った後に動作します。

+0

私の場合、新しいセルの値は何とかして既存のセルに依存し、単純なincrやappendよりも複雑になります。たとえば、私は整数のKである古いセルの値を持っています。これをK_new = K^K 'に更新したいとします。ここで、K'は生産からのある種の増分の種類の値です。多分関連するAPIを見つけました:テーブル:: checkAndPut(https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/client/HTable.html#checkAndPut-byte:A-byte:A-byte: A-byte:A-org.apache。hadoop.hbase.client.Put-)。しかし、私はどのようにそれを使用するか分からない。それが助けになると思いますか?ありがとう。 – user1206899

+0

私は上にリストされたAPIは、原子操作を達成するのに役立つと思う。最終的には、何か意味のあるものを置くことが必要です。 – user1206899

関連する問題