2012-10-12 26 views

Odpowiedz

9

Zgaduję, że szukasz SingleColumnValueFilter w HBase. Jak wspomniano w API

Aby zapobiec cały wiersz z emitowanego jeśli kolumna nie znajduje się w jednym rzędzie, należy setFilterIfMissing(boolean) na obiekcie filtrów. W przeciwnym razie, jeśli kolumna zostanie znaleziona, cały wiersz będzie emitowany tylko wtedy, gdy wartość minie. Jeśli wartość nie powiedzie się, wiersz zostanie odfiltrowany.

Ale SingleColumnValueFilter chciałby mieć wartość kolumny X „CompareOp” do czegoś, powiedzmy przynieść ten wiersz, jeśli ColumnX == „X” lub przynieść ten wiersz, jeśli ColumnX! = „A wartości wskaźnikowych, które mogą ColumnX never take "i setFilterIfMissing(true), więc jeśli kolumna X ma jakąś wartość, jest zwracana.

Mam nadzieję, że to cię popchnie we właściwym kierunku.

+0

dziękuję bardzo. to bardzo pomogło. zmienione na – Sanket

1

Możesz użyć SkipFilter wraz z ColumnPrefixFilter. ColumnPrefixFilter otrzymuje klucze tam, gdzie kolumna istnieje (wiersz HBase będzie miał kolumnę tylko wtedy, gdy ma wartość), filtr przeskoku daje "Not" na pierwszym filtrze, więc wiersz zostanie pominięty

+0

Uwaga, spowoduje to przekazanie tylko tych wierszy, w których _wszystkie kolumny z wiersza przechodzą przez filtr prefiksu –

0

Użytkownik Ankit Arnon1573269

jedynym sposobem mogę dostać to działa, jest jak poniżej

więc - mam tabeli z kolumny RULE1, rule2, rule3 i tak dalej. Wiersze mogą mieć tylko kolumnę rule1 lub rule1 i rule2 lub rule1 i rule2 and rule3 i tak dalej. Powiedz: chcę wyodrębnić wiersze, które mają TYLKO regułę1. Teraz to oznacza, że ​​będę musiał pominąć wiersze, które mają w nich regułę2.

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); 

Chociaż to zadziałało, nie jestem zbytnio zadowolony z rozwiązania. Jego obliczenie zajmuje hbase. Pomyślałem, że powinna istnieć prostsza metoda, która nie musi sprawdzać wartości. Arnon, twoja metoda nie działa, ponieważ SkipFilter pominie te, które DONOT spełniają warunek. W związku z tym skonstruowanie go z ColumnPrefixFilter nie spełnia wymagań.