1.聲明
當前內容主要用於本人學習和複習,當前的內容主要爲官方文檔中的Filter Query
當前內容中的工具類基於前面的博文
準備數據表test-filter,並開始寫入數據
2.FilterList查詢
/**
* @description 當前內容主要用於測試FilterList的查詢操作
* @author hy
* @date 2020-06-18
*/
public class FilterListTest {
private static String tableName = "test-filter";
public static void main(String[] args) throws IOException {
HBaseUtils hBaseUtils = new HBaseUtils("192.168.1.104:2181");
Scan scan = new Scan();
// 這裏使用的是or關係,可以修改爲and FilterList.Operator.MUST_PASS_ALL;
FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ONE);
SingleColumnValueFilter filter1 = new SingleColumnValueFilter("cf".getBytes(), "name".getBytes(),
CompareOperator.EQUAL, Bytes.toBytes("admin"));
list.addFilter(filter1);
SingleColumnValueFilter filter2 = new SingleColumnValueFilter("cf".getBytes(), "name".getBytes(),
CompareOperator.EQUAL, Bytes.toBytes("guest"));
list.addFilter(filter2);
scan.setFilter(list);
// 結果爲兩個數據,說明這個表示FilterList表示的關係應該是or
List<Result> results = hBaseUtils.scanTable(tableName, scan);
for (Result result : results) {
System.out.println(result);
}
hBaseUtils.close();
}
}
上面的查詢時,查詢列cf:name中是admin和guest的row,使用關係爲or
結果爲:
修改上面的查詢條件:FilterList.Operator.MUST_PASS_ALL
,使用and查詢,結果爲空
3.SingleColumnValueFilter查詢
/**
* @description 當前內容主要用於測試SingleColumnValueFilter的查詢操作
* @author hy
* @date 2020-06-18
*/
public class SingleColumnValueFilterTest {
private static String tableName = "test-filter";
public static void main(String[] args) throws IOException {
HBaseUtils hBaseUtils = new HBaseUtils("192.168.1.104:2181");
Scan scan = new Scan();
SingleColumnValueFilter filter1 = new SingleColumnValueFilter("cf".getBytes(), "name".getBytes(),
CompareOperator.EQUAL, Bytes.toBytes("admin"));
scan.setFilter(filter1);
List<Result> results = hBaseUtils.scanTable(tableName, scan);
for (Result result : results) {
System.out.println(result);
}
hBaseUtils.close();
}
}
這裏的查詢是,查詢cf:name爲admin的row的數據,返回row數據
結果爲:
4.ColumnValueFilter查詢
/**
* @description 使用ColumnValueFilter的查詢
* @author hy
* @date 2020-06-18
*/
public class ColumnValueFilterTest {
private static String tableName="test-filter";
public static void main(String[] args) throws IOException {
HBaseUtils hBaseUtils = new HBaseUtils("192.168.1.104:2181");
Scan scan = new Scan();
ColumnValueFilter filter1 = new ColumnValueFilter("cf".getBytes(), "name".getBytes(),
CompareOperator.EQUAL, Bytes.toBytes("admin"));
scan.setFilter(filter1);
List<Result> results = hBaseUtils.scanTable(tableName, scan);
for (Result result : results) {
System.out.println(result);
}
hBaseUtils.close();
}
}
結果爲:
發現返回結果就一個列,說明這個ColumnValueFilter查詢只返回查詢的列和對應的值(用於檢測是否存在這樣的列的值)
,返回結果是單元格級別
5.RegexStringComparator查詢
從名字來看應該就是正則查詢
/**
* @description 當前內容主要用於測試RegexStringComparator的查詢操作
* @author hy
* @date 2020-06-18
*/
public class RegexStringComparatorTest {
private static String tableName = "test-filter";
public static void main(String[] args) throws IOException {
HBaseUtils hBaseUtils = new HBaseUtils("192.168.1.104:2181");
Scan scan = new Scan();
RegexStringComparator comp=new RegexStringComparator("a.");
SingleColumnValueFilter filter1 = new SingleColumnValueFilter("cf".getBytes(), "name".getBytes(),
CompareOperator.EQUAL, comp);
// 使用正則查詢當前的表中的數據,查詢column爲cf:a並且值以a開頭的數據行
scan.setFilter(filter1);
List<Result> results = hBaseUtils.scanTable(tableName, scan);
for (Result result : results) {
System.out.println(result);
}
hBaseUtils.close();
}
}
上面的查詢:查詢cf:name中的數據是以aXXX的數據
從結果上來看,返回的結果是row級別的
6.SubstringComparator查詢
從名稱上看應該就是substring方法的查詢吧?
/**
* @description 當前內容主要用於測試RegexStringComparator的查詢操作
* @author hy
* @date 2020-06-18
*/
public class SubstringComparatorTest {
private static String tableName = "test-filter";
public static void main(String[] args) throws IOException {
HBaseUtils hBaseUtils = new HBaseUtils("192.168.1.104:2181");
Scan scan = new Scan();
SubstringComparator comp = new SubstringComparator("has all");
SingleColumnValueFilter filter1 = new SingleColumnValueFilter("cf".getBytes(), "desc".getBytes(),
CompareOperator.EQUAL, comp);
scan.setFilter(filter1);
List<Result> results = hBaseUtils.scanTable(tableName, scan);
for (Result result : results) {
System.out.println(result);
}
hBaseUtils.close();
}
}
上面的查詢中就是查詢cf:desc中包含has all字符的數據
發現這種查詢也是row級別的
7.FamilyFilter查詢
應該是查詢列族?
/**
* @description 當前內容主要用於測試FamilyFilter的查詢操作(列族的查詢操作)
* @author hy
* @date 2020-06-18
*/
public class FamilyFilterTest {
private static String tableName = "test-filter";
public static void main(String[] args) throws IOException {
HBaseUtils hBaseUtils = new HBaseUtils("192.168.1.104:2181");
Scan scan = new Scan();
FamilyFilter filter1=new FamilyFilter(CompareOperator.EQUAL, new BinaryComparator(Bytes.toBytes("cf")));
scan.setFilter(filter1);
List<Result> results = hBaseUtils.scanTable(tableName, scan);
for (Result result : results) {
System.out.println(result);
}
hBaseUtils.close();
}
}
當前的查詢就是查詢列族是cf的數據
發現查詢的數據是,只有匹配的列族的纔會查詢的出來,級別爲單元格級別
8.QualifierFilter查詢
應該是查詢Qualifier,列=列族:Qualifier
/**
* @description 當前內容主要用於測試QualifierFilter的查詢操作(列族:Qualifiter的Qualifiter查詢操作)
* @author hy
* @date 2020-06-18
*/
public class QualifierFilterTest {
private static String tableName = "test-filter";
public static void main(String[] args) throws IOException {
HBaseUtils hBaseUtils = new HBaseUtils("192.168.1.104:2181");
Scan scan = new Scan();
QualifierFilter filter1=new QualifierFilter(CompareOperator.EQUAL, new BinaryComparator(Bytes.toBytes("name")));
scan.setFilter(filter1);
// 查詢所有的列族爲XXX:name的數據,只顯示XXX:name的列,不顯示其他的
List<Result> results = hBaseUtils.scanTable(tableName, scan);
for (Result result : results) {
System.out.println(result);
}
hBaseUtils.close();
}
}
上面查詢列族:name的數據
發現查詢的數據是單元格級別的
9.ColumnPrefixFilter查詢
從名字上看應該是列前綴的查詢
/**
* @description 當前內容主要用於測試FamilyFilter的查詢操作(列族的查詢操作)
* @author hy
* @date 2020-06-18
*/
public class ColumnPrefixFilterTest {
private static String tableName = "test-filter";
public static void main(String[] args) throws IOException {
HBaseUtils hBaseUtils = new HBaseUtils("192.168.1.104:2181");
Scan scan = new Scan();
// 查詢所有的列,並且Qualifier是以c開頭的列族(即查詢cXXX),並且Qualifier中也包含c的數據
ColumnPrefixFilter filter1=new ColumnPrefixFilter("c".getBytes());
scan.setFilter(filter1);
List<Result> results = hBaseUtils.scanTable(tableName, scan);
for (Result result : results) {
System.out.println(result);
}
hBaseUtils.close();
}
}
發現沒有匹配的數據,將當前的查詢的c替換成n繼續查詢
說明當前的ColumnPrefixFilter查詢實際上是查詢Qualifier的前綴的查詢,查詢結果是單元格級別的
10.MultipleColumnPrefixFilter查詢
由於ColumnPrefixFilter是單元格級別的查詢並且查詢的是Qualifier的前綴,那麼這個應該是多前綴查詢
/**
* @description 當前內容主要用於測試FamilyFilter的查詢操作(列族的查詢操作)
* @author hy
* @date 2020-06-18
*/
public class MultipleColumnPrefixFilterTest {
private static String tableName = "test-filter";
public static void main(String[] args) throws IOException {
HBaseUtils hBaseUtils = new HBaseUtils("192.168.1.104:2181");
Scan scan = new Scan();
//只查詢列族Qualifier中具有a,d的行的數據(返回結果中只有a和d開頭的數據)
byte[][] prefiexs = { Bytes.toBytes("n"), Bytes.toBytes("d") };
MultipleColumnPrefixFilter filter1 = new MultipleColumnPrefixFilter(prefiexs);
scan.setFilter(filter1);
List<Result> results = hBaseUtils.scanTable(tableName, scan);
for (Result result : results) {
System.out.println(result);
}
hBaseUtils.close();
}
}
結果爲:
說明這就是多列的Qualifiler的查詢,返回的數據是單元格級別的
11.ColumnRangeFilter
列區間查詢,應該是Qualifier的區間查詢
/**
* @description 測試ColumnRangeFilter(列區間過濾器)
* @author hy
* @date 2020-06-18
*/
public class ColumnRangeFilterTest {
private static String tableName = "test-filter";
public static void main(String[] args) throws IOException {
HBaseUtils hBaseUtils = new HBaseUtils("192.168.1.104:2181");
Scan scan = new Scan();
// 只查詢列族中的Qualifier從aaaa到zzzz的行的數據
ColumnRangeFilter filter1 = new ColumnRangeFilter(Bytes.toBytes("aaaa"), true, Bytes.toBytes("zzzz"), true);
scan.setFilter(filter1);
List<Result> results = hBaseUtils.scanTable(tableName, scan);
for (Result result : results) {
System.out.println(result);
}
hBaseUtils.close();
}
}
結果爲:
發現查詢的只是Qualifier,使用aaaa到zzzz區間的數據,是單元格級別的
12.RowFilter查詢
應該是按照row kwy進行查詢
/**
* @description 測試RowFilter
* @author hy
* @date 2020-06-18
*/
public class RowFilterTest {
private static String tableName = "test-filter";
public static void main(String[] args) throws IOException {
HBaseUtils hBaseUtils = new HBaseUtils("192.168.1.104:2181");
Scan scan = new Scan();
// 按照行的名稱進行搜索,可以指定其實行和結束行的名稱
RowFilter filter1 = new RowFilter(CompareOperator.EQUAL,new BinaryComparator("row2".getBytes()));
scan.withStartRow("row1".getBytes());// 設置搜索的起始行
scan.withStopRow("row3".getBytes()); // 設置搜索的結束行
scan.setFilter(filter1);
List<Result> results = hBaseUtils.scanTable(tableName, scan);
for (Result result : results) {
System.out.println(result);
}
hBaseUtils.close();
}
}
可以通過scan設置查詢的起始行和結束行
返回的結果是row級別的
13.FirstKeyOnlyFilter查詢
public class FirstKeyOnlyFilterTest {
private static String tableName = "test-filter";
public static void main(String[] args) throws IOException {
HBaseUtils hBaseUtils = new HBaseUtils("192.168.1.104:2181");
Scan scan = new Scan();
// 返回每一行的第一個單元格中的數據
FirstKeyOnlyFilter filter1 = new FirstKeyOnlyFilter();
scan.setFilter(filter1);
List<Result> results = hBaseUtils.scanTable(tableName, scan);
for (Result result : results) {
System.out.println(result);
}
hBaseUtils.close();
}
}
結果:
發現查詢的是desc,結合scan發現,當前查詢的是排在最前面的row的第一個單元格數據,返回的數據結果是單元格級別的
14.總結
1.可以使用FilterList實現多個一起查詢,可以指定是and還是or查詢
2.查詢可以通過值查詢、列族查詢、Qualifier查詢、還有row等查詢方式
以上純屬個人見解,如有問題請聯繫本人!