HBase:Filter Query

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等查詢方式

以上純屬個人見解,如有問題請聯繫本人!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章