2012-10-12 8 views

Antwort

9

Ich glaube, Sie suchen nach SingleColumnValueFilter in HBase. Wie in den genannten

API

aus der gesamten Zeile verhindern ausgesendet wird, wenn die Spalte nicht auf einer Zeile gefunden wird, verwenden setFilterIfMissing(boolean) auf Filterobjekt. Andernfalls, wenn die Spalte gefunden wird, wird die gesamte Zeile nur ausgegeben, wenn der Wert übergeben wird. Wenn der Wert fehlschlägt, wird die Zeile herausgefiltert.

Aber SingleColumnValueFilter würde einen Wert wollen Spalte X „CompareOp“, um etwas zu haben, sagen diese Reihe bringen, wenn ColumnX == „X“ oder diese Reihe bringen, wenn ColumnX! = „Ein Sentinel-Wert, ColumnX kann Nimm niemals "und setFilterIfMissing(true), so dass, wenn ColumnX einen Wert hat, es zurückgegeben wird.

Ich hoffe, dass dies Sie in die richtige Richtung anstupst.

+0

vielen Dank. Es hat sehr geholfen. upvoted – Sanket

1

Sie können SkipFilter zusammen mit ColumnPrefixFilter verwenden. Der ColumnPrefixFilter erhält Schlüssel, wo die Spalte existiert (eine HBase-Zeile hat nur eine Spalte, wenn sie einen Wert hat). Der Skip-Filter gibt Ihnen "Not" auf dem ersten Filter, so dass die Zeile entfällt

+0

Beachten Sie, dass dies nur Zeilen weitergibt, in denen _all_ die Spalten in der Zeile den Präfixfilter übergeben –

0

Ankit Arnon user1573269

Die einzige Art, wie ich es Arbeit bekommen konnte, ist wie unten

also - ich habe eine Tabelle mit Spalten Regel1, rule2, Regel3 und so weiter. Zeilen können nur die Spalte rule1 oder rule1 und rule2 oder rule1 und rule2 und rule3 usw. enthalten. Sprich: Ich möchte Zeilen extrahieren, die NUR rule1 enthalten. Jetzt bedeutet das, ich werde Zeilen überspringen müssen, die Regel2 in ihnen haben.

Scan getRules = new Scan(); 
    ColumnPrefixFilter rule1Filter = new ColumnPrefixFilter(Bytes.toBytes("rule1")); 
    SingleColumnValueFilter skipRule2Value = new  SingleColumnValueFilter(Bytes.toBytes("rules"),Bytes.toBytes("rule2"), 
    CompareOp.EQUAL,Bytes.toBytes("0")); 
    SkipFilter skipRule2 = new SkipFilter(skipRule2Value); 
    getRules.setFilter(rule1Filter); 
    getRules.setFilter(skipRule2); 
    ResultScanner scanner = htable.getScanner(getRules); 

Obwohl dies funktionierte, bin ich nicht sehr glücklich mit der Lösung. Es dauert Zeit für HBase, um herauszufinden. Ich hätte gedacht, dass es eine einfachere Methode geben sollte, die den Wert nicht überprüfen muss. Arnon, deine Methode funktioniert nicht, weil SkipFilter diejenigen überspringt, die DONOT die Bedingung erfüllen. Wenn Sie es aus einem ColumnPrefixFilter erstellen, wird die Anforderung daher nicht erfüllt.