前言: 本文詳細介紹了 HBase QualifierFilter 過濾器 Java&Shell API 的使用,並貼出了相關示例代碼以供參考。QualifierFilter 基於列名進行過濾,在工作中涉及到需要通過HBase 列名進行數據過濾時可以考慮使用它。比較器細節及原理請參照之前的更文: " ...
前言:本文詳細介紹了 HBase QualifierFilter 過濾器 Java&Shell API 的使用,並貼出了相關示例代碼以供參考。QualifierFilter 基於列名進行過濾,在工作中涉及到需要通過HBase 列名進行數據過濾時可以考慮使用它。比較器細節及原理請參照之前的更文:HBase Filter 過濾器之比較器 Comparator 原理及源碼學習
一。Java Api
頭部代碼
/**
* 用於列名(Qualifier)過濾。
*/
public class QualifierFilterDemo {
private static boolean isok = false;
private static String tableName = "test";
private static String[] cfs = new String[]{"f"};
private static String[] data = new String[]{
"row-1:f:name:Wang", "row-1:f:age:20",
"row-2:f:name:Zhou", "row-2:f:age:10",
"row-3:f:gender:男", "row-3:f:name:Li",
"row-4:f:namana:xyz", "row-4:f:age:Zhao"
};
public static void main(String[] args) throws IOException {
MyBase myBase = new MyBase();
Connection connection = myBase.createConnection();
if (isok) {
myBase.deleteTable(connection, tableName);
myBase.createTable(connection, tableName, cfs);
// 造數據
myBase.putRows(connection, tableName, data);
}
Table table = connection.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();
中部代碼
向右滑動滾動條可查看輸出結果。
1. BinaryComparator 構造過濾器
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("age"))); // [row-1:f:age, row-2:f:age, row-4:f:age]
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("name"))); // [row-1:f:age, row-2:f:age, row-3:f:gender, row-4:f:age, row-4:f:namana]
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.GREATER, new BinaryComparator(Bytes.toBytes("gender"))); // [row-1:f:name, row-2:f:name, row-3:f:name, row-4:f:namana]
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL, new BinaryComparator(Bytes.toBytes("name"))); // [row-1:f:name, row-2:f:name, row-3:f:name]
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.LESS, new BinaryComparator(Bytes.toBytes("gender"))); // [row-1:f:age, row-2:f:age, row-4:f:age]
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("gender"))); // [row-1:f:age, row-2:f:age, row-3:f:gender, row-4:f:age]
2. BinaryPrefixComparator 構造過濾器
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("nam"))); // [row-1:f:name, row-2:f:name, row-3:f:name, row-4:f:namana]
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.NOT_EQUAL, new BinaryPrefixComparator(Bytes.toBytes("nam"))); // [row-1:f:age, row-2:f:age, row-3:f:gender, row-4:f:age]
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.GREATER, new BinaryPrefixComparator(Bytes.toBytes("g"))); // [row-1:f:name, row-2:f:name, row-3:f:name, row-4:f:namana]
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL, new BinaryPrefixComparator(Bytes.toBytes("n"))); // [row-1:f:name, row-2:f:name, row-3:f:name, row-4:f:namana]
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.LESS, new BinaryPrefixComparator(Bytes.toBytes("m"))); // [row-1:f:age, row-2:f:age, row-3:f:gender, row-4:f:age]
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryPrefixComparator(Bytes.toBytes("a"))); // [row-1:f:age, row-2:f:age, row-4:f:age]
3. SubstringComparator 構造過濾器
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("g")); // [row-1:f:age, row-2:f:age, row-3:f:gender, row-4:f:age]
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.NOT_EQUAL, new SubstringComparator("n")); // [row-1:f:age, row-2:f:age, row-4:f:age]
4. RegexStringComparator 構造過濾器
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.NOT_EQUAL, new RegexStringComparator("nam")); // [row-1:f:age, row-2:f:age, row-3:f:gender, row-4:f:age]
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("nam")); // [row-1:f:name, row-2:f:name, row-3:f:name, row-4:f:namana]
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("n[a-z]m")); // [row-1:f:name, row-2:f:name, row-3:f:name, row-4:f:namana]
尾部代碼
scan.setFilter(qualifierFilter);
ResultScanner scanner = table.getScanner(scan);
Iterator<Result> iterator = scanner.iterator();
LinkedList<String> rowkeys = new LinkedList<>();
while (iterator.hasNext()) {
Result result = iterator.next();
String rowkey = Bytes.toString(result.getRow());
rowkeys.add(rowkey);
}
System.out.println(rowkeys);
scanner.close();
table.close();
connection.close();
}
}
二。Shell Api
1. BinaryComparator 構造過濾器
方式一:
hbase(main):003:0> scan 'test',{FILTER=>"QualifierFilter(=,'binary:age')"}
ROW COLUMN+CELL
row-1 column=f:age, timestamp=1589252853542, value=20
row-2 column=f:age, timestamp=1589252853542, value=10
row-4 column=f:age, timestamp=1589252853542, value=Zhao
3 row(s) in 0.0680 seconds
支持的比較運算符:= != > >= < <=,不再一一舉例。
方式二:
import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.BinaryComparator
import org.apache.hadoop.hbase.filter.QualifierFilter
hbase(main):010:0> scan 'test',{FILTER => QualifierFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'), BinaryComparator.new(Bytes.toBytes('age')))}
ROW COLUMN+CELL
row-1 column=f:age, timestamp=1589252853542, value=20
row-2 column=f:age, timestamp=1589252853542, value=10
row-4 column=f:age, timestamp=1589252853542, value=Zhao
3 row(s) in 0.0400 seconds
支持的比較運算符:LESS、LESS_OR_EQUAL、EQUAL、NOT_EQUAL、GREATER、GREATER_OR_EQUAL,不再一一舉例。
推薦使用方式一,更簡潔方便。
2. BinaryPrefixComparator 構造過濾器
方式一:
hbase(main):011:0> scan 'test',{FILTER=>"QualifierFilter(=,'binaryprefix:nam')"}
ROW COLUMN+CELL
row-1 column=f:name, timestamp=1589252853542, value=Wang
row-2 column=f:name, timestamp=1589252853542, value=Zhou
row-3 column=f:name, timestamp=1589252853542, value=Li
row-4 column=f:namana, timestamp=1589252853542, value=xyz
4 row(s) in 0.0410 seconds
方式二:
import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.BinaryPrefixComparator
import org.apache.hadoop.hbase.filter.QualifierFilter
hbase(main):014:0> scan 'test',{FILTER => QualifierFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'), BinaryPrefixComparator.new(Bytes.toBytes('nam')))}
ROW COLUMN+CELL
row-1 column=f:name, timestamp=1589252853542, value=Wang
row-2 column=f:name, timestamp=1589252853542, value=Zhou
row-3 column=f:name, timestamp=1589252853542, value=Li
row-4 column=f:namana, timestamp=1589252853542, value=xyz
4 row(s) in 0.0200 seconds
其它同上。
3. SubstringComparator 構造過濾器
方式一:
hbase(main):015:0> scan 'test',{FILTER=>"QualifierFilter(=,'substring:am')"}
ROW COLUMN+CELL
row-1 column=f:name, timestamp=1589252853542, value=Wang
row-2 column=f:name, timestamp=1589252853542, value=Zhou
row-3 column=f:name, timestamp=1589252853542, value=Li
row-4 column=f:namana, timestamp=1589252853542, value=xyz
4 row(s) in 0.0230 seconds
方式二:
import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.SubstringComparator
import org.apache.hadoop.hbase.filter.QualifierFilter
hbase(main):017:0> scan 'test',{FILTER => QualifierFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'), SubstringComparator.new('am'))}
ROW COLUMN+CELL
row-1 column=f:name, timestamp=1589252853542, value=Wang
row-2 column=f:name, timestamp=1589252853542, value=Zhou
row-3 column=f:name, timestamp=1589252853542, value=Li
row-4 column=f:namana, timestamp=1589252853542, value=xyz
4 row(s) in 0.0220 seconds
區別於上的是這裡直接傳入字元串進行比較,且只支持EQUAL和NOT_EQUAL兩種比較符。
4. RegexStringComparator 構造過濾器
import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.RegexStringComparator
import org.apache.hadoop.hbase.filter.QualifierFilter
hbase(main):019:0> scan 'test',{FILTER => QualifierFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'), RegexStringComparator.new('n[a-z]m'))}
ROW COLUMN+CELL
row-1 column=f:name, timestamp=1589252853542, value=Wang
row-2 column=f:name, timestamp=1589252853542, value=Zhou
row-3 column=f:name, timestamp=1589252853542, value=Li
row-4 column=f:namana, timestamp=1589252853542, value=xyz
4 row(s) in 0.0250 seconds
該比較器直接傳入字元串進行比較,且只支持EQUAL和NOT_EQUAL兩種比較符。若想使用第一種方式可以傳入regexstring試一下,我的版本有點低暫時不支持,不再演示了。
註意這裡的正則匹配指包含關係,對應底層find()方法。
QualifierFilter 不支持使用LongComparator比較器,且BitComparator、NullComparator 比較器用之甚少,也不再介紹。
查看文章全部源代碼請訪以下GitHub地址:
https://github.com/zhoupengbo/demos-bigdata/blob/master/hbase/hbase-filters-demos/src/main/java/com/zpb/demos/QualifierFilterDemo.java
轉載請註明出處!歡迎關註本人微信公眾號【HBase工作筆記】