首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

怎么使用Java API读写Hbase

2013-12-02 
如何使用Java API读写HbaseHbase是够建在HDFS之上的半结构化的分布式存储系统,具有HDFS的所有优点,同时也

如何使用Java API读写Hbase
Hbase是够建在HDFS之上的半结构化的分布式存储系统,具有HDFS的所有优点,同时也有自己的亮点,支持更快速的随机读写以及更灵活的Scan操作,而在HDFS上这一点我们是远远做不到的,因为HDFS仅支持Append追加操作,而且也不具备随机读写一条数据的功能,实际上HDFS扫描的范围按Block来算的,所以从某个角度来言,Hbase利用Schemal的方式做到了这一点。

一般情况下,我们使用Linux的shell命令,就可以非常轻松的操作Hbase,例如一些建表,建列簇,插值,显示所有表,统计数量等等,但有时为了提高灵活性,我们也需要使用编程语言来操作Hbase,当然Hbase通过Thrift接口提供了对大多数主流编程语言的支持,例如C++,PHP,Python,Ruby等等,那么本篇,散仙给出的例子是基于Java原生的API操作Hbase,相比其他的一些编程语言,使用Java操作Hbase,会更加高效一些,因为Hbase本身就是使用Java语言编写的。

下面,散仙给出源码,以供参考:

package com.hbase;import java.util.ArrayList;import java.util.List;import org.apache.hadoop.conf.Configuration;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.client.Delete;import org.apache.hadoop.hbase.client.Get;import org.apache.hadoop.hbase.client.HBaseAdmin;import org.apache.hadoop.hbase.client.HTable;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.util.Bytes;/** * @author 三劫散仙 *  * **/public class Test {static Configuration conf=null;static{  conf=HBaseConfiguration.create();//hbase的配置信息  conf.set("hbase.zookeeper.quorum", "10.2.143.5");  //zookeeper的地址}public static void main(String[] args)throws Exception {Test t=new Test();//t.createTable("temp", new String[]{"name","age"}); //t.insertRow("temp", "2", "age", "myage", "100");// t.getOneDataByRowKey("temp", "2");t.showAll("temp"); }/*** * 创建一张表 * 并指定列簇 * */public void createTable(String tableName,String cols[])throws Exception{ HBaseAdmin admin=new HBaseAdmin(conf);//客户端管理工具类if(admin.tableExists(tableName)){System.out.println("此表已经存在.......");}else{HTableDescriptor table=new HTableDescriptor(tableName);for(String c:cols){HColumnDescriptor col=new HColumnDescriptor(c);//列簇名table.addFamily(col);//添加到此表中} admin.createTable(table);//创建一个表 admin.close(); System.out.println("创建表成功!");}}/** * 添加数据, * 建议使用批量添加 * @param tableName 表名 * @param row  行号 * @param columnFamily 列簇 * @param column   列 * @param value   具体的值 *  * **/    public  void insertRow(String tableName, String row,              String columnFamily, String column, String value) throws Exception {          HTable table = new HTable(conf, tableName);          Put put = new Put(Bytes.toBytes(row));          // 参数出分别:列族、列、值          put.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column),                  Bytes.toBytes(value));                table.put(put);          table.close();//关闭        System.out.println("插入一条数据成功!");    }            /**     * 删除一条数据     * @param tableName 表名     * @param row  rowkey     * **/    public void deleteByRow(String tableName,String rowkey)throws Exception{    HTable h=new HTable(conf, tableName);    Delete d=new Delete(Bytes.toBytes(rowkey));    h.delete(d);//删除一条数据    h.close();    }        /**     * 删除多条数据     * @param tableName 表名     * @param row  rowkey     * **/    public void deleteByRow(String tableName,String rowkey[])throws Exception{    HTable h=new HTable(conf, tableName);         List<Delete> list=new ArrayList<Delete>();    for(String k:rowkey){    Delete d=new Delete(Bytes.toBytes(k));    list.add(d);    }    h.delete(list);//删除    h.close();//释放资源    }        /**     * 得到一条数据     *      * @param tableName 表名     * @param rowkey 行号     * ***/    public void getOneDataByRowKey(String tableName,String rowkey)throws Exception{    HTable h=new HTable(conf, tableName);        Get g=new Get(Bytes.toBytes(rowkey));    Result r=h.get(g);    for(KeyValue k:r.raw()){        System.out.println("行号:  "+Bytes.toStringBinary(k.getRow()));    System.out.println("时间戳:  "+k.getTimestamp());    System.out.println("列簇:  "+Bytes.toStringBinary(k.getFamily()));    System.out.println("列:  "+Bytes.toStringBinary(k.getQualifier()));    //if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){    //System.out.println("值:  "+Bytes.toInt(k.getValue()));    //}else{    String ss=Bytes.toString(k.getValue());    System.out.println("值:  "+ss);    //}                 }    h.close();            }        /**     * 扫描所有数据或特定数据     * @param tableName     * **/    public void showAll(String tableName)throws Exception{    HTable h=new HTable(conf, tableName);         Scan scan=new Scan();     //扫描特定区间     //Scan scan=new Scan(Bytes.toBytes("开始行号"),Bytes.toBytes("结束行号"));     ResultScanner scanner=h.getScanner(scan);     for(Result r:scanner){     System.out.println("==================================");    for(KeyValue k:r.raw()){        System.out.println("行号:  "+Bytes.toStringBinary(k.getRow()));    System.out.println("时间戳:  "+k.getTimestamp());    System.out.println("列簇:  "+Bytes.toStringBinary(k.getFamily()));    System.out.println("列:  "+Bytes.toStringBinary(k.getQualifier()));    //if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){    //System.out.println("值:  "+Bytes.toInt(k.getValue()));    //}else{    String ss=Bytes.toString(k.getValue());    System.out.println("值:  "+ss);    //}                 }     }    h.close();        }}

显示所有数据的打印输出如下:
==================================行号:  1时间戳:  1385597699287列簇:  name列:  myname值:  秦东亮==================================行号:  2时间戳:  1385598393306列簇:  age列:  myage值:  100行号:  2时间戳:  1385597723900列簇:  name列:  myname值:  三劫散仙



由此,可以看出Hbase的对外的API提供接口,是非常简单易用的。

热点排行