Chcę wykonać skanowanie hbase z filtrami. Na przykład moja tabela ma kolumny A, B, C i A ma kolumnę X. Niektóre wiersze mają kolumnę X, a inne nie. Jak mogę zaimplementować filtr, aby odfiltrować wszystkie wiersze z kolumną X?Jak odfiltrować wiersze z podaną kolumną (nie puste)?
Odpowiedz
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.
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
Uwaga, spowoduje to przekazanie tylko tych wierszy, w których _wszystkie kolumny z wiersza przechodzą przez filtr prefiksu –
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ń.
dziękuję bardzo. to bardzo pomogło. zmienione na – Sanket