HBase為篩選數據提供了一組過濾器,通過這個過濾器可以在HBase中的數據的多個維度(行,列,數據版本)上進行對數據的篩選操作,也就是說過濾器最終能夠篩選的數據能夠細化到具體的一個存儲單元格上(由行鍵,列明,時間戳定位)。通常來說,通過行鍵,值來篩選數據的應用場景較多。 1.創建測試表studne ...
HBase為篩選數據提供了一組過濾器,通過這個過濾器可以在HBase中的數據的多個維度(行,列,數據版本)上進行對數據的篩選操作,也就是說過濾器最終能夠篩選的數據能夠細化到具體的一個存儲單元格上(由行鍵,列明,時間戳定位)。通常來說,通過行鍵,值來篩選數據的應用場景較多。
1.創建測試表studnet1
Vi Student1.java
import java.io.IOException; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.client.Put; public class Student1{ public static void main(String[] args){ HBaseConfiguration config = new HBaseConfiguration(); config.set("hbase.zookeeper.quorum", "h201,h202,h203"); String tablename = new String("student1"); try{ HBaseAdmin admin = new HBaseAdmin(config); if(admin.tableExists(tablename)){ admin.disableTable(tablename); admin.deleteTable(tablename); } HTableDescriptor tableDesc = new HTableDescriptor(tablename); tableDesc.addFamily(new HColumnDescriptor("cf1")); admin.createTable(tableDesc); admin.close(); HTable table = new HTable(config, Bytes.toBytes("student1")); Put put1 = new Put(Bytes.toBytes("a101")); put1.add(Bytes.toBytes("cf1"),Bytes.toBytes("name"),Bytes.toBytes("zs1")); Put put2 = new Put(Bytes.toBytes("a102")); put2.add(Bytes.toBytes("cf1"),Bytes.toBytes("name"),Bytes.toBytes("ls1")); Put put3 = new Put(Bytes.toBytes("a103")); put3.add(Bytes.toBytes("cf1"),Bytes.toBytes("name"),Bytes.toBytes("ww1")); table.put(put1); table.put(put2); table.put(put3); table.close(); } catch(IOException e) { e.printStackTrace(); } } }
- 使用過濾器
1.1
RowFilter:篩選出匹配的所有的行,對於這個過濾器的應用場景,是非常直觀的:使用BinaryComparator可以篩選出具有某個行鍵的行,或者通過改變比較運算符(CompareFilter.CompareOp.EQUAL)來篩選出符合某一條件的多條數據
RowFilter用於過濾row key
Operator |
Description |
LESS |
小於 |
LESS_OR_EQUAL |
小於等於 |
[EQUAL |
等於 |
NOT_EQUAL |
不等於 |
GREATER_OR_EQUAL |
大於等於 |
GREATER |
大於 |
NO_OP |
排除所有 |
Comparator |
Description |
BinaryComparator |
使用Bytes.compareTo()比較 |
BinaryPrefixComparator |
和BinaryComparator差不多,從前面開始比較 |
RegexStringComparator |
正則表達式 |
SubstringComparator |
把數據當成字元串,用contains()來判斷 |
import java.io.IOException; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.filter.RowFilter; import org.apache.hadoop.hbase.filter.Filter; import org.apache.hadoop.hbase.filter.BinaryComparator; import org.apache.hadoop.hbase.filter.CompareFilter; public class hss1{ public static void main(String[] args){ HBaseConfiguration config = new HBaseConfiguration(); config.set("hbase.zookeeper.quorum", "h201,h202,h203"); try{ HTable table = new HTable(config, Bytes.toBytes("student1")); Scan scan = new Scan(); Filter filter1 = new RowFilter(CompareFilter.CompareOp.EQUAL,new BinaryComparator("a101".getBytes())); scan.setFilter(filter1); ResultScanner rst = table.getScanner(scan); for (Result r:rst){ for (KeyValue kv : r.raw()) { StringBuffer s1 = new StringBuffer() .append(Bytes.toString(kv.getRow())).append(":") .append(Bytes.toString(kv.getFamily())).append(",") .append(Bytes.toString(kv.getQualifier())).append(",") .append(Bytes.toString(kv.getValue())); System.out.println(s1.toString()); } } rst.close(); table.close(); } catch(IOException e) { e.printStackTrace(); } } }
1.2
PrefixFilter:篩選出具有特定首碼的行鍵的數據。這個過濾器所實現的功能其實也可以由RowFilter結合RegexStringComparator來實現,不過這裡提供了一種簡便的使用方法
import org.apache.hadoop.hbase.filter.PrefixFilter;
Filter filter2 = new PrefixFilter(Bytes.toBytes("a"));
scan.setFilter(filter2);
1.3
RegexComparator 正則過濾
import org.apache.hadoop.hbase.filter.RegexStringComparator;
Filter filter3 = new RowFilter(CompareFilter.CompareOp.EQUAL,new RegexStringComparator("^a.*"));
scan.setFilter(filter3);