Ich möchte einen HBase Scan mit Filtern machen. Zum Beispiel hat meine Tabelle die Spaltenfamilie A, B, C und A hat eine Spalte X. Einige Zeilen haben die Spalte X und andere nicht. Wie kann ich den Filter implementieren, um alle Zeilen mit der Spalte X herauszufiltern?Wie filtere ich Zeilen mit einer bestimmten Spalte (nicht null)?
Antwort
Ich glaube, Sie suchen nach SingleColumnValueFilter
in HBase. Wie in den genannten
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.
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
Beachten Sie, dass dies nur Zeilen weitergibt, in denen _all_ die Spalten in der Zeile den Präfixfilter übergeben –
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.
vielen Dank. Es hat sehr geholfen. upvoted – Sanket