2013-08-26 34 views
8

Có cách nào để chỉ định nhiều bộ lọc trong khi quét không? Ví dụ - Chỉ định cả ColumnFamilyFilterRowFilter?Chỉ định nhiều bộ lọc trong hbase

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

Tôi cũng muốn thêm ColumnFilter đến s. Nhưng nó rõ ràng sẽ ghi đè lên bộ lọc mới nhất.

Trả lời

18

Bạn phải tạo đối tượng FilterList và thêm tất cả bộ lọc bạn muốn và đặt đối tượng FilterList làm bộ lọc này. Bạn có thể sử dụng hàm tạo hoặc sử dụng phương thức addFilter() để thêm bộ lọc vào danh sách bộ lọc.

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

THanks. Làm thế nào để tôi có được làm việc tương tự trong shell hbase? – priya

7

nếu bạn đang thêm nhiều bộ lọc sau đó hãy nhớ rằng theo mặc định filterlist sử dụng

FilterList.Operator.MUST_PASS_ALL 

có nghĩa là tất cả các bộ lọc phải được thông qua (AND điều kiện). Sử dụng

FilterList.Operator.MUST_PASS_ONE 

nếu bạn muốn áp dụng HOẶC điều kiện cho bộ lọc.

0

Bạn có thể sử dụng đối tượng FilterList để thêm danh sách bộ lọc và có thể kiểm soát thứ tự bộ lọc bằng cách sử dụng ArrayList. Mỗi FilterList chỉ có một toán tử đơn [OR, AND]. Nhưng, một hệ thống phân cấp của danh sách bộ lọc có thể được tạo bằng cách thêm nhiều thể hiện danh sách bộ lọc với toán tử riêng của chúng vào danh sách bộ lọc cha.

Ví dụ: bộ lọc_1 & bộ lọc_2 là hai danh sách bộ lọc.

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) 
Các vấn đề liên quan