上一篇cm5.4和cdh5.4安裝(http://my.oschina.net/penngo/blog/517223),本文使用HBase的java客戶端api操做Hbase。java
須要用到的包能夠在/opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p0.3/jars找到,hbase版本1.0.0正則表達式
HbaseTest3.java代碼例子apache
import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.MasterNotRunningException; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.ZooKeeperConnectionException; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.client.Table; import org.apache.hadoop.hbase.filter.BinaryPrefixComparator; import org.apache.hadoop.hbase.filter.Filter; import org.apache.hadoop.hbase.filter.RowFilter; import org.apache.hadoop.hbase.filter.SingleColumnValueFilter; import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp; import org.apache.hadoop.hbase.filter.SubstringComparator; import org.apache.hadoop.hbase.filter.ValueFilter; import org.apache.hadoop.hbase.util.Bytes; public class HbaseTest3 { private Connection connection = null; public HbaseTest3() { } public void createTable(String tableName) { try { System.out.println("start create table ......"); Connection con = this.getConnection(); HBaseAdmin hBaseAdmin = (HBaseAdmin) con.getAdmin(); if (hBaseAdmin.tableExists(tableName)) {// 若是存在要建立的表,那麼先刪除,再建立 hBaseAdmin.disableTable(tableName); hBaseAdmin.deleteTable(tableName); System.out.println(tableName + " is exist,detele...."); } HTableDescriptor tableDescriptor = new HTableDescriptor( TableName.valueOf(tableName)); tableDescriptor.addFamily(new HColumnDescriptor("column1")); tableDescriptor.addFamily(new HColumnDescriptor("column2")); tableDescriptor.addFamily(new HColumnDescriptor("column3")); hBaseAdmin.createTable(tableDescriptor); System.out.println("create table success......"); } catch (MasterNotRunningException e) { e.printStackTrace(); } catch (ZooKeeperConnectionException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void insertData(String tableName) { System.out.println("start insert data ......"); try { Connection con = this.getConnection(); Table table = con.getTable(TableName.valueOf(tableName)); // HTablePool pool = new HTablePool(configuration, 1000); // HTable table = (HTable) pool.getTable(tableName); Put put = new Put("112233bbbcccc".getBytes());// 一個PUT表明一行數據,再NEW一個PUT表示第二行數據,每行一個惟一的ROWKEY,此處rowkey爲put構造方法中傳入的值 put.addColumn("column1".getBytes(), null, "aaa2".getBytes());// 本行數據的第一列 put.addColumn("column2".getBytes(), null, "bbb2".getBytes());// 本行數據的第三列 put.addColumn("column3".getBytes(), null, "ccc2".getBytes());// 本行數據的第三列 table.put(put); // pool.getTable(tableName).put(put); } catch (IOException e) { e.printStackTrace(); } System.out.println("end insert data ......"); } public void queryAll(String tableName) { // HTablePool pool = new HTablePool(configuration, 1000); // HTable table = (HTable) pool.getTable(tableName); try { Connection con = this.getConnection(); Table table = con.getTable(TableName.valueOf(tableName)); ResultScanner rs = table.getScanner(new Scan()); for (Result r : rs) { System.out.println("得到到rowkey:" + new String(r.getRow())); for (KeyValue keyValue : r.raw()) { System.out.println("列:" + new String(keyValue.getFamily()) + "====值:" + new String(keyValue.getValue())); } } } catch (IOException e) { e.printStackTrace(); } } public void queryByCondition1(String tableName) { try { Connection con = this.getConnection(); Table table = con.getTable(TableName.valueOf(tableName)); Get scan = new Get("112233bbbcccc".getBytes());// 根據rowkey查詢 Result r = table.get(scan); System.out.println("得到到rowkey:" + new String(r.getRow())); for (KeyValue keyValue : r.raw()) { System.out.println("列:" + new String(keyValue.getFamily()) + "====值:" + new String(keyValue.getValue())); } } catch (IOException e) { e.printStackTrace(); } } public void queryByCondition2(String tableName) { try { Connection con = this.getConnection(); Table table = con.getTable(TableName.valueOf(tableName)); Filter filter = new SingleColumnValueFilter( Bytes.toBytes("column1"), null, CompareOp.EQUAL, Bytes.toBytes("aaa2")); // 當列column1的值爲aaa時進行查詢 Scan s = new Scan(); s.setFilter(filter); ResultScanner rs = table.getScanner(s); for (Result r : rs) { System.out.println("得到到rowkey:" + new String(r.getRow())); for (KeyValue keyValue : r.raw()) { System.out.println("列:" + new String(keyValue.getFamily()) + "====值:" + new String(keyValue.getValue())); } } } catch (Exception e) { e.printStackTrace(); } } public void queryByCondition3(String tableName) { try { Connection con = this.getConnection(); Table table = con.getTable(TableName.valueOf(tableName)); // 提取rowkey以cccc結尾數據 // Filter filter1 = new RowFilter(CompareOp.EQUAL,new RegexStringComparator(".*cccc$")); // // 提取rowkey以包含bbb的數據 // Filter filter1 = new RowFilter(CompareOp.EQUAL,new SubstringComparator("bbb")); // 提取rowkey以123開頭的數據 Filter filter1 = new RowFilter(CompareOp.EQUAL,new BinaryPrefixComparator("1122".getBytes())); // Filter filter1 = new RowFilter(CompareOp.EQUAL, // new BinaryComparator(Bytes.toBytes(rowkey))); Scan scan = new Scan(); scan.setFilter(filter1); ResultScanner rs = table.getScanner(scan); for (Result r : rs) { System.out.println("得到到rowkey:" + new String(r.getRow())); for (Cell cell : r.rawCells()) { System.out.println("列:" + new String(CellUtil.cloneFamily(cell)) + "====值:" + new String(CellUtil.cloneValue(cell))); } } rs.close(); } catch (Exception e) { e.printStackTrace(); } } public void queryByCondition4(String tableName) { try { Connection con = this.getConnection(); Table table = con.getTable(TableName.valueOf(tableName)); Filter filter1 = new ValueFilter(CompareOp.EQUAL, new SubstringComparator("aaa2")); Scan scan = new Scan(); scan.setFilter(filter1); ResultScanner rs = table.getScanner(scan); for (Result r : rs) { System.out.println("得到到rowkey:" + new String(r.getRow())); for (Cell cell : r.rawCells()) { System.out.println("列:" + new String(CellUtil.cloneFamily(cell)) + "====值:" + new String(CellUtil.cloneValue(cell))); } } rs.close(); } catch (Exception e) { e.printStackTrace(); } } public void close() throws IOException { if (connection != null) { connection.close(); } } public Connection getConnection() throws IOException { Configuration configuration = HBaseConfiguration.create(); configuration.set("hbase.zookeeper.property.clientPort", "2181"); configuration.set("hbase.zookeeper.quorum", "192.168.17.108"); if (connection == null) { connection = ConnectionFactory.createConnection(configuration); } return connection; } public static void main(String[] args) { HbaseTest3 hbaseTest = new HbaseTest3(); try { String tableName = "test1"; hbaseTest.createTable("test1"); hbaseTest.insertData("test1"); hbaseTest.queryAll("test1"); // hbaseTest.queryByCondition1(tableName); // hbaseTest.queryByCondition2(tableName); // hbaseTest.queryByCondition3(tableName); // hbaseTest.queryByCondition4(tableName); hbaseTest.close(); } catch (Exception e) { e.printStackTrace(); } } }
運行結果:api
HBase過濾器提供了很是強大的特性來幫助用戶提升其處理表中數據的效率。用戶不只可使用HBase中已經定義好的過濾器,還能夠自定義過濾器。dom
Get和Scan兩個類都支持過濾器。oop
CompareFilter中的比較運算符優化
操做 | 描述 |
---|---|
LESS | 匹配小於設定值的值 |
LESS_OR_EQUAL | 匹配小於或等於設定值的值 |
EQUAL | 匹配等於設定值的值 |
NOT_EQUAL | 匹配大於設定值不相同的值 |
GREATER_OR_EQUAL | 匹配大於或等於設定值的值 |
GREATER | 匹配大於設定值的值 |
NOT_OP | 排除一切值 |
比較器this
比較器 | 描述 |
---|---|
BinaryComparator | 使用Bytes.compareTo()比較當前值與閾值 |
BinaryPrefixComparator | 與上面的類似,使用Bytes.compareTo()進行匹配,可是是從左端開始前綴匹配 |
NullComparator | 不作匹配,只判斷當前值是否是null |
BitComparator | 經過BitwiseOp類提供的按位與(AND),或(OR),異或(XOR)操做執行位級比較 |
RegexStringComparator | 根據一個正則表達式,在實例化這個比較器的時候去匹配表中數據 |
SubstringComparator | 把閾值和表中數據當作String實例,同時經過contains()操做匹配字符串 |
行過濾器是基於行鍵來過濾數據spa
列族過濾器是基於列族來進行過濾數據.net
列名過濾器用戶篩選特定的列
值過濾器用戶篩選某個特定值的單元格。與RegexStringComparator配合使用,可使用功能強大的表達式來進行篩選。
參考列過濾器不單單簡單的經過用戶指定的信息篩選數據,還容許用戶指定一個參考列或是引用列。並使用參考列控制其餘列的過濾。
用一列的值決定是否一行數據是否被過濾
該過濾器繼承SingleColumnValueFilter,反考烈不會包含在結果中。
篩選出具備特色前綴的行鍵的數據。掃描操做以字典序查找,當遇到比前綴大的行時,掃描結束。PrefixFilter對get()方法做用不大。前綴過濾器只針對行鍵。
可使用這個過濾器對結果按行分頁。當用戶建立PageFilter的實例的時候,指定了pageSize,這個參數能夠控制每頁返回的行數。
只返回每行的行鍵,不返回值。對於之關注於行鍵的應用常見來講很是合適,不返回值,能夠減小傳遞到客戶端的數據量,能起到必定的優化做用。
只想返回的結果集中只包含第一列的數據
開始行被包含在結果中,單終止行被排除在外,使用這個過濾器,也能夠將結束行包含在結果中。
使用時間戳過濾器能夠對掃描結果中對版本進行細粒度的控制。
肯定每行最多返回多少列,並在遇到必定的列數超過咱們鎖設置的限制值的時候,結束掃描操做
與PageFilter相似,列分頁過濾器能夠對一行的全部列進行分頁。
相似PrefixFilter,列前綴過濾器經過對列名進行前綴匹配過濾
隨機行過濾器可讓結果中包含隨機行。
與ValueFilter結合使用,若是發現一行中的某一列不符合條件,那麼整行都會被過濾掉。
若是你想一想要在遇到某種條件數據以前的數據時,就可使用這個過濾器,當遇到不符合設定條件的數據的時候,整個掃描也結束了。
能夠經過實現Filter接口或者直接竭誠FilterBase類來實現自定義過濾器。