Hbase API中常用类介绍和使用

Hbase API 常用类应用

网上Hbase的介绍有很多,案例也不少。自己写了个Demo,进行一些简单的总结。

HBase 常用类介绍。

JAVA API HBase数据库模型之间的关系

JAVA

Hbase 数据模型

HBaseAdmin

数据库(database)

HBaseConfiguration

HTable

(table)

HTableDescriptor

列族(Column Family)

Put

行列操作

Get

Scanner

 

下面说说JAVA API 提供的这些类的功能。和他们之间有什么样的联系。

1.HBaseConfiguration

关系:org.apache.hadoop.hbase.HBaseConfiguration

作用:通过此类可以对HBase进行配置

用法实例: Configuration config = HBaseConfiguration.create();

说明: HBaseConfiguration.create() 默认会从classpath 中查找 hbase-site.xml 中的配置信息,初始化 Configuration

2.HBaseAdmin

关系:org.apache.hadoop.hbase.client.HBaseAdmin

作用:提供接口关系HBase 数据库中的表信息

用法:HBaseAdmin admin = new HBaseAdmin(config);

3.HTableDescriptor

关系:org.apache.hadoop.hbase.HTableDescriptor

作用:HTableDescriptor 类包含了表的名字以及表的列族信息

用法:HTableDescriptor htd =new HTableDescriptor(tablename);

           Htd.addFamily(new HColumnDescriptor(“myFamily”));

4.HColumnDescriptor

关系:org.apache.hadoop.hbase.HColumnDescriptor

作用:HColumnDescriptor 维护列族的信息

用法:HTableDescriptor htd =new HTableDescriptor(tablename);

           Htd.addFamily(new HColumnDescriptor(“myFamily”));

5.HTable

关系:org.apache.hadoop.hbase.client.HTable

作用:HTable HBase 的表通信

用法:HTable tab = new HTable(config,Bytes.toBytes(tablename));

           ResultScanner sc = tab.getScanner(Bytes.toBytes(“familyName”));

说明:获取表内列族 familyNme 的所有数据。

6.Put

关系:org.apache.hadoop.hbase.client.Put

作用:获取单个行的数据

用法:HTable table = new HTable(config,Bytes.toBytes(tablename));

           Put put = new Put(row);

           p.add(family,qualifier,value);

说明:向表 tablename 添加 “family,qualifier,value”指定的值。

7.Get

关系:org.apache.hadoop.hbase.client.Get

作用:获取单个行的数据

用法:HTable table = new HTable(config,Bytes.toBytes(tablename));

           Get get = new Get(Bytes.toBytes(row));

           Result result = table.get(get);

说明:获取 tablename 表中 row 行的对应数据

8.ResultScanner

关系:Interface

作用:获取值的接口

用法:ResultScanner scanner = table.getScanner(Bytes.toBytes(family));

           For(Result rowResult : scanner){

                   Bytes[] str = rowResult.getValue(family,column);

}

说明:循环获取行中列值。

下面例子使用的就是上面提供的类和接口。

例子1

/**

     * 获取表中所有数据

     */

    @SuppressWarnings("unchecked")

    publicstatic List<Map> getDateAll(String tablename){

       ResultScanner rs = null;

       HTable table  = null;

       try {

           table = new HTable(cfg,tablename);

           Scan s = new Scan();

           //扫描全表,性能不佳

           rs = table.getScanner(s);

           for(Result r=rs.next();r!=null;r=rs.next()){                       for(KeyValue kv : r.raw()){

                  System.out.println(new String(kv.getValue()));

              }

           }

       } catch (Exception e) {

           returnnull;

       }finally{

           rs.close();

       }

       return list;

    }

HBase是大数据的分布式数据库,当使用全表扫描肯定是不合理。下面的例子相比较例子1做些优化。

例子2

/**

     * 指定rowkey的开始和结束扫描表数据

     */

    @SuppressWarnings("unchecked")

    publicstatic List<Map> getDateAll(String tablename){

       ... //篇幅原因省略

       try {

           table = new HTable(cfg,tablename);

           Scan s = new Scan();

           //通过rowkey来指定数据开始和结束,性能上较例子1高很多 

            s.setStartRow(Bytes.toBytes(“2012-12-22”));

           s.setStopRow(Bytes.toBytes(“2012-12-23”));

           rs = table.getScanner(s);

           ... //篇幅原因省略

       } catch (Exception e) {

           ...//篇幅原因省略

    }

当使用扫描器 scan.setStartRow(Bytes)scan.setStopRow(Bytes)查询的数据还不能满足结果集的话,下面的一些类就派上用场了,他就是Filter

客户端请求过滤器

A.      逐一说一下Filter

1.       FilterList  

FilterList 代表一个过滤器列表,过滤器间具有

FilterList.Operator.MUST_PASS_ALL

FilterList.Operator.MUST_PASS_ONE 的关系,下面展示一个过滤器的 关系。

下面FilterList 列表中检查同一属性的'value1' 'value2' 

FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ONE);

SingleColumnValueFilter filter1 = new SingleColumnValueFilter(Bytes.toBytes(“cfamily”), Bytes.toBytes(“column”),CompareOp.EQUAL,Bytes.toBytes("value1"));

list.add(filter1);

SingleColumnValueFilter filter2 = new SingleColumnValueFilter(Bytes.toBytes(“cfamily”), Bytes.toBytes(“column”), CompareOp.EQUAL, Bytes.toBytes("value2"));

List.add(filter2);

 

2.       SingleColumnValueFilter   

SingleColumnValueFilter 用于测试列值相等 (CompareOp.EQUAL ), 不等 (CompareOp.NOT_EQUAL),或范围 (e.g., CompareOp.GREATER). 下面示例检查列值和字符串'my values' 相等...

SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(“cFamily”), Bytes.toBytes(“column”), CompareOp.EQUAL, Bytes.toBytes("values"));
scan.setFilter(filter);

3.       ColumnPrefixFilter

ColumnPrefixFilter 用于指定列名前缀值相等

Byte[] prefix = Bytes.toBytes(“values”);
Filter f = new ColumnPrefixFilter(prefix);
scan.setFilter(f);

4.       MultipleColumnPrefixFilter

MultipleColumnPrefixFilter ColumnPrefixFilter 行为差不多,但可以指定多个前缀。

byte[][] prefixes = new byte[][] {Bytes.toBytes("value1"), Bytes.toBytes("value2")};
Filter f = new MultipleColumnPrefixFilter(prefixes);
scan.setFilter(f);

5.       QualifierFilter

QualifierFilter 是基于列名的过滤器。

Filter f = new QualifierFilter(“QualifierName”);
scan.setFilter(f);

6.       RowFilter

RowFilter rowkey过滤器,通常根据rowkey来指定范围时,使用scan扫描器的StartRowStopRow 方法比较好。Rowkey也可以使用。

Filter f = new RowFilter(“rowkey”);
scan.setFilter(f);

B.比较器

7.       RegexStringComparator

RegexStringComparator 是支持正则表达式的比较器。

过滤器配合上比较器会很方便。看下面的代码。

解释一下:代码中绿色字体标注的代码就是正则比较器的使用方法。参数 reg 就是正则验证的规则。

HTable table = new HTable(cfg,"datainfo");
Scan scan = new Scan();
String reg = "^136([0-9]{8})$";//满足136开头的手机号
RowFilter filter = new RowFilter(CompareOp.EQUAL, 
new RegexStringComparator(reg));
scan.setFilter(filter);
ResultScanner rs = table.getScanner(scan);
for(Result rr : rs){
for(KeyValue kv : rr.raw()){
         ...
}
}

8.       SubstringComparator

SubstringComparator 用于检测一个子串是否存在于值中。大小写不敏感。

//检测values 是否存在于查询的列值中
SubstringComparator comp = new SubstringComparator("values");
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(“family”), Bytes.toBytes(“column”),CompareOp.EQUAL, Bytes.toBytes(“value”));
scan.setFilter(filter);

基本用法也就是这些。欢迎指正点评。

猜你喜欢

转载自mrpengpengda.iteye.com/blog/1832595