2017-11-08 2 views
0

Angenommen, ich habe eine Spalte, die inkrementell anders als das Überschreiben aktualisiert wird (wie ein bitweises Integer-Flag oder eine Summenspalte). Zum Beispiel (unter der Annahme, nur 1-Version):Kann ich in hbase Zellen zusammenführen?

Bestehende Cell: [key: 'k1', f1: Summe: 100]
anstende New Cell: [key: 'k1', f1: Summe: 200 ]

Dann möchte ich die Zellendaten auf diese Weise aktualisieren: sum = 100 + 200 = 300. Nachgeben der Endaufzeichnung:
[key: 'k1', f1: Summe: 300]

Hier möchte ich MERGE die neue Zelle in die alte mit dem gleichen Schlüssel. Wie kann ich das erreichen? Eine direkte setzen würde einfach die alte Zelle überschreiben. (Wiederum wird nur eine Version gepflegt).

komme ich mit einem paar Ideen, aber sie scheinen nicht jedoch erfüllt:

1> Auf der Clientseite ersten erhält der alte Wert dann Summe addieren, auf dem Gehen Objekt setzen.

2> Verwenden Sie einen Coprozessor. In RegionObserver.prePut mache ich ein erhalten, hinzufügen und ändern Sie die endgültige Put Objekt. Dies drückt die Berechnung auf die Serverseite, benötigt aber immer noch eine zusätzliche Abfrage (get) (was teuer sein könnte).

Neben der oben genannten Arbeit in Echtzeit-Abfrage-Szenario, aber was ist mit Bulk-Load-Daten zusammenführen?

Ich habe die Dokumente eine ganze Weile durchgelesen, kann aber noch keine Anhaltspunkte finden. Ich würde es wirklich schätzen, wenn Sie eine Idee dazu teilen könnten.

Ich verwende hbase-1.2.6. Vielen Dank!

Antwort

0

Wenn ich Ihren Anwendungsfall richtig verstehe und die Werte werden lange Ganzzahlen sein, dann denke ich, dass HBase Inkrementierung Betrieb für Sie arbeiten sollte. Sehen Sie sich das HBase 1.2.6 Javadoc für Increment für Details an.

Wenn es nicht das arithmetische Inkrement ist, das Sie möchten, hat HBase auch eine Append-Operation, die verwendet werden kann, um automatisch mehr Daten an eine vorhandene Zelle anzuhängen.

Beachten Sie, dass javacdoc erwähnt, dass Increments und Attends Atomizität für Schreibvorgänge garantieren, aber nicht für Lesevorgänge, was falsch ist. Tatsächlich garantieren sie auch Atomarität für Lesevorgänge (seit HBase 0.95), und dies wurde in späteren Versionen in den Dokumenten behoben.

Auch die Increment- und Append-Operationen machen keinen zusätzlichen Get-RPC. Sie arbeiten, indem sie eine Zeilensperre auf der Serverseite nehmen und dann einen Lesevorgang ausführen, gefolgt von einem Schreibvorgang auf dem Server unter derselben Sperre.

+0

In meinem Fall hängt der neue Zellenwert irgendwie von der vorhandenen Zelle ab und könnte komplexer sein als ein einfacher incr oder append. Zum Beispiel habe ich einen alten Zellenwert, der eine Ganzzahl K ist, und ich möchte ihn auf K_new = K^K 'aktualisieren, wobei K' eine inkrementelle Art von Wert aus der Produktion ist. Ich habe eine vielleicht verwandte API gefunden: Table :: checkAndPut (https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/client/HTable.html#checkAndPut-byte:A-byte:A-byte: Ein Byte: A-org.apache.hadoop.hbase.client.Put-). Aber ich bin mir nicht sicher, wie ich es benutzen soll. Denkst du, dass es helfen kann? Vielen Dank. – user1206899

+0

Ich denke, die API, die ich oben aufgeführt habe, hilft nur, atomare Operation zu erreichen. Am Ende muss ich einen Schritt machen, gefolgt von einem Put in welchem ​​Sinn auch immer. – user1206899

Verwandte Themen