2013-08-26 11 views
8

Gibt es eine Möglichkeit, mehrere Filter während eines Scans anzugeben? Zum Beispiel - Geben Sie sowohl ColumnFamilyFilter als auch RowFilter an?Mehrere Filter in hbase angeben

Filter rowFilter = 
       new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator(
         rowFilterString)); 
     Scan s = new Scan(); 
     s.setFilter(rowFilter); 

Ich wollte auch ein ColumnFilter-s hinzuzufügen. Aber es überschreibt offensichtlich den neuesten Filter.

Antwort

18

Sie müssen ein FilterList-Objekt erstellen und alle gewünschten Filter hinzufügen und dieses Objekt FilterList als Filter festlegen. Sie können entweder den Konstruktor verwenden oder die Methode addFilter() verwenden, um der Filterliste Filter hinzuzufügen.

FilterList filterList = new FilterList(); 
filterList.addFilter(new RowFilter(...)); 
filterList.addFilter(new ColumnFilter(...)); 
Scan s = new Scan(); 
s.setFilter(filterList); 
+0

THanks. Wie bekomme ich die gleiche Arbeit in HBase Shell? – priya

7

, wenn Sie mehrere Filter hinzugefügt werden dann denken Sie daran, dass standardmäßig verwendet filter

FilterList.Operator.MUST_PASS_ALL 

die alle Filtermittel müssen bestanden (UND-Bedingung) werden. Verwenden

FilterList.Operator.MUST_PASS_ONE 

wenn Sie Filter anwenden ODER Bedingung wollen.

0

Sie können das FilterList-Objekt verwenden, um Ihre Filterliste hinzuzufügen und die Reihenfolge der Filter mithilfe einer ArrayList zu steuern. Jede FilterList nimmt nur einen einzigen Operator [OR, UND] auf. Aber eine Hierarchie von Filterlisten kann erstellt werden, indem mehrere Filterlisteninstanzen mit ihren eigenen Operatoren zu einer übergeordneten Filterliste hinzugefügt werden.

Zum Beispiel: filters_1 & filters_2 sind zwei Filterlisten.

FilterList filterList1 = new FilterList(FilterList.Operator.MUST_PASS_ONE,filters_1) 
FilterList filterList2 = new FilterList(FilterList.Operator.MUST_PASS_ALL,filters_2) 


List<Filter> filterAggregate = new ArrayList<Filter(); 
filterAggregate.add(filterList1) 
filterAggregate.add(filterList2) 

FilterList filterList3 = new FilterList(FilterList.Operator.MUST_PASS_ALL,filterAggregate)