HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。

HBase 表一般特点:

1)大:一个表可以有上亿行,上百万列

2)面向列:面向列(族)的存储和权限控制,列(族)独立检索

3)稀疏:对于为空(null)的列并不占用存储空间,表可以设计非常稀疏

Java 调用 Hbase 非关系型数据库,Hbase 中提供了相关的 Java API 访问接口便于使用,下面是本人综合网络总结的通过 Java 操作 HBase 进行创建、修改、删除表以及查询等。具体封装代码如下:

package yoodb.hbase;

import java.io.IOException;

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.HTablePool;
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; public class HBaseTest {     // 声明静态配置
    static Configuration conf = null;
    static final HTablePool tablePool;
    static {
        conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", "yoodb");
        tablePool = new HTablePool(conf, 15);
    }     /*
     * 创建表
     * @tableName 表名
     * @family 列族数组
     */
    public static void creatTable(String tableName, String[] family)
            throws Exception {
        HBaseAdmin admin = new HBaseAdmin(conf);
        HTableDescriptor desc = new HTableDescriptor(tableName);
        for (int i = 0; i < family.length; i++) {
            desc.addFamily(new HColumnDescriptor(family[i]));
        }
        if (admin.tableExists(tableName)) {
            System.out.println("table Exists!");
            System.exit(0);
        } else {
            admin.createTable(desc);
            System.out.println("create table Success!");
        }
    }     /*
     * 表添加数据
     * @rowKey rowKey
     * @tableName 表名
     * @column1 第一个列族数组 realname
     * @value1 第一个列的值的数组
     * @column2 第二个列族数组 address
     * @value2 第二个列的值的数组
     */
    public static void addTableData(String rowKey, String tableName,String[] column1, String[] value1, String[] column2, String[] value2)
            throws IOException {
        Put put = new Put(Bytes.toBytes(rowKey));
        HTable table = (HTable) tablePool.getTable(tableName);
        HColumnDescriptor[] columnFamilies = table.getTableDescriptor()
                .getColumnFamilies();         for (int i = 0; i < columnFamilies.length; i++) {
            String familyName = columnFamilies[i].getNameAsString();
            if (familyName.equals("realname")) {
                for (int j = 0; j < column1.length; j++) {
                    put.add(Bytes.toBytes(familyName),Bytes.toBytes(column1[j]), Bytes.toBytes(value1[j]));
                }
            }
            if (familyName.equals("address")) {
                for (int j = 0; j < column2.length; j++) {
                    put.add(Bytes.toBytes(familyName),Bytes.toBytes(column2[j]), Bytes.toBytes(value2[j]));
                }
            }
        }
        table.put(put);
    }     /*
     * 更新表中的某一列
     * @tableName 表名
     * @rowKey rowKey
     * @familyName 列族名
     * @columnName 列名
     * @value 更新后的值
     */
    public static void updateTable(String tableName, String rowKey,
            String familyName, String columnName, String value)
            throws IOException {
        HTable table = (HTable) tablePool.getTable(tableName);
        Put put = new Put(Bytes.toBytes(rowKey));
        put.add(Bytes.toBytes(familyName), Bytes.toBytes(columnName),Bytes.toBytes(value));
        table.put(put);
System.out.println("update table Success!");
    }     /*
     * 根据rwokey查询
     * @rowKey rowKey
     * @tableName 表名
     */
    public static Result getResult(String tableName, String rowKey)
            throws IOException {
        Get get = new Get(Bytes.toBytes(rowKey));
        HTable table = (HTable) tablePool.getTable(tableName);
        Result result = table.get(get);
        for (KeyValue kv : result.list()) {
            System.out.println("family==>" + Bytes.toString(kv.getFamily()));
            System.out.println("qualifier==>" + Bytes.toString(kv.getQualifier()));
            System.out.println("value==>" + Bytes.toString(kv.getValue()));
            System.out.println("Timestamp==>" + kv.getTimestamp());
        }
        return result;
    }     /*
     * 遍历查询hbase表数组
     * @tableName 表名
     */
    public static void getResultScann(String tableName) throws IOException {
        Scan scan = new Scan();
        ResultScanner rs = null;
        HTable table = (HTable) tablePool.getTable(tableName);
        try {
            rs = table.getScanner(scan);
            for (Result r : rs) {
                for (KeyValue kv : r.list()) {
                    System.out.println("family==>" + Bytes.toString(kv.getFamily()));
                    System.out.println("qualifier==>" + Bytes.toString(kv.getQualifier()));
                    System.out.println("value==>" + Bytes.toString(kv.getValue()));
                    System.out.println("timestamp==>" + kv.getTimestamp());
                }
            }
        } finally {
            rs.close();
        }
    }     /*
     * 查询表中的某单一列
     * @tableName 表名
     * @rowKey rowKey
     */
    public static void getResultByColumn(String tableName, String rowKey,
            String familyName, String columnName) throws IOException {
        HTable table = (HTable) tablePool.getTable(tableName);
        Get get = new Get(Bytes.toBytes(rowKey));
        get.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName)); // 获取指定列族以及列中修饰符对应列名
        Result result = table.get(get);
        for (KeyValue kv : result.list()) {
            System.out.println("family==>" + Bytes.toString(kv.getFamily()));
            System.out.println("qualifier==>" + Bytes.toString(kv.getQualifier()));
            System.out.println("value==>" + Bytes.toString(kv.getValue()));
            System.out.println("Timestamp==>" + kv.getTimestamp());
        }
    }     /*
     * 查询某列数据的多个版本
     * @tableName 表名
     * @rowKey rowKey
     * @familyName 列族名
     * @columnName 列名
     */
    public static void getResultByVersion(String tableName, String rowKey,
            String familyName, String columnName) throws IOException {
        HTable table = (HTable) tablePool.getTable(tableName);
        Get get = new Get(Bytes.toBytes(rowKey));
        get.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName));
        get.setMaxVersions(5);
        Result result = table.get(get);
        for (KeyValue kv : result.list()) {
            System.out.println("family==>" + Bytes.toString(kv.getFamily()));
            System.out.println("qualifier==>" + Bytes.toString(kv.getQualifier()));
            System.out.println("value==>" + Bytes.toString(kv.getValue()));
            System.out.println("Timestamp==>" + kv.getTimestamp());
        }
        
    }     /*
     * 删除指定的列
     * @tableName 表名
     * @rowKey rowKey
     * @familyName 列族名
     * @columnName 列名
     */
    public static void deleteColumn(String tableName, String rowKey,
            String falilyName, String columnName) throws IOException {
        HTable table = (HTable) tablePool.getTable(tableName);
        Delete deleteColumn = new Delete(Bytes.toBytes(rowKey));
        deleteColumn.deleteColumns(Bytes.toBytes(falilyName),Bytes.toBytes(columnName));
        table.delete(deleteColumn);
        System.out.println(falilyName + "==>" + columnName + "is deleted!");
    }     /*
     * 删除指定的列
     * @tableName 表名
     * @rowKey rowKey
     */
    public static void deleteAllColumn(String tableName, String rowKey) throws IOException {
        HTable table = (HTable) tablePool.getTable(tableName);
        Delete deleteAll = new Delete(Bytes.toBytes(rowKey));
        table.delete(deleteAll);
        System.out.println("all columns are deleted!");
    }     /*
     * 删除表
     * 
     * @tableName 表名
     */
    public static void deleteTable(String tableName) throws IOException {
        HBaseAdmin admin = new HBaseAdmin(conf);
        admin.disableTable(tableName);
        admin.deleteTable(tableName);
        System.out.println(tableName + " is deleted!");
    }
}

Java Hbase main函数测试类,具体代码如下:

package com.yoodb;

public class Test {
public static void main(String[] args) throws Exception {
        // 创建表
        String tableName = "yoodbblog";
        String[] family = { "realname","address" };
        HBaseTest.creatTable(tableName,family);
// 为表添加数据
String[] column1 = { "title", "author", "content" }; 
String[] value1 = {"素文宅","yoodb","www.yoodb.com" }; 
String[] column2 = { "name", "nickname" };
        String[] value2 = { "真实名称", "昵称" }; 
        HBaseTest.addTableData("rowkey1","yoodbblog",column1, value1, column2, value2);
// 删除一列
        HBaseTest.deleteColumn("yoodbblog", "rowkey1", "realname", "name");
        // 删除所有列
        HBaseTest.deleteAllColumn("yoodbblog", "rowkey1");
        // 删除表
        HBaseTest.deleteTable("yoodbblog");
        // 查询
        HBaseTest.getResult("yoodbblog", "rowkey1");
        // 查询某一列的值
        HBaseTest.getResultByColumn("yoodbblog", "rowkey1", "realname", "nickname");
        // 修改某一列的值
        HBaseTest.updateTable("yoodbblog", "rowkey1", "realname", "nickname","假昵称");
        // 遍历表数据查询
        HBaseTest.getResultScann("yoodbblog");
        // 查询某列的多版本
        HBaseTest.getResultByVersion("yoodbblog", "rowkey1", "realname", "name");
    }
} 来源:http://blog.yoodb.com/yoodb/article/detail/1092

Java 调用 Hbase API 访问接口实现方案的更多相关文章

  1. java实现利用httpclient访问接口

    HTTP协议时Internet上使用的很多也很重要的一个协议,越来越多的java应用程序需要通过HTTP协议来访问网络资源. HTTPClient提供的主要功能: 1.实现了所有HTTP的方法(GET ...

  2. Java 调用Restful API接口的几种方式--HTTPS

    摘要:最近有一个需求,为客户提供一些Restful API 接口,QA使用postman进行测试,但是postman的测试接口与java调用的相似但并不相同,于是想自己写一个程序去测试Restful ...

  3. java servlet手机app访问接口(一)数据加密传输验证

    前面几篇关于servlet的随笔,算是拉通了 servlet的简单使用流程,接下去的文章将主要围绕手机APP访问接口这块出发续写,md5加密传输--->短信验证--->手机推送---> ...

  4. Java 调用 Rest api 设置经典 Linux 虚拟机的实例启停

    现象描述 用户可以通过 Rest API 设置经典 Linux 虚拟机实例的启停.在调用该 API 时需要通过 Azure Active Directory(下文简称 AAD) 获取 Token,但是 ...

  5. java调用.net的webservice接口

    要调用webservice,首先得有接口,用已经写好的接口地址在myEclipse的目标project中,右键->new web service client-> 选择JAX-WS方式,点 ...

  6. Java调用http保留访问状态

    package com.coracle; import com.coracle.yk.xframework.util.yunTongXun.HttpRequest; import java.io.*; ...

  7. java servlet手机app访问接口(三)高德地图云存储及检索

    这篇关于高德地图的随笔内容会多一点, 一.业务说明     对应APP业务中的成员有两类,一是服务人员,二是被服务人员,  主要实现功能, 对APP中的服务人员位置进行时时定位, 然后通过被服务人员登 ...

  8. java servlet手机app访问接口(二)短信验证

    今天找了几个短信平台,其实最想使用的一个是sharesdk,使用它上面http api短信功能,不仅价格低,而且最少可以充值100RMB,但是审核过于严格,对应APP还必须集成他们的短信功能,而且要上 ...

  9. JPush极光推送 Java调用服务器端API开发

       极光推送是:使得开发者可以即时地向其应用程序的用户推送通知或者消息,与用户保持互动,从而有效地提高留存率,提升用户体验.简单的说就是通过JPush后台管理网站进行app消息的推送.可以让用户及时 ...

随机推荐

  1. SSL证书自签名使用及监控

    前言 证书简介 信息安全越来越受重视,HTTPS已经相当普及,要让我们的HTTP接口支持HTPPS,只需要一个SSL证书就可以啦 全称公钥证书(Public-Key Certificate, PKC) ...

  2. 2. SOFAJRaft源码分析—JRaft的定时任务调度器是怎么做的?

    看完这个实现之后,感觉还是要多看源码,多研究.其实JRaft的定时任务调度器是基于Netty的时间轮来做的,如果没有看过Netty的源码,很可能并不知道时间轮算法,也就很难想到要去使用这么优秀的定时调 ...

  3. Java的Object类

    (1)Object是类层次结构的根类,所有的类都直接或者间接的继承自Object类. (2)Object类的构造方法有一个,并且是无参构造 这其实就是理解当时我们说过,子类构造方法默认访问父类的构造是 ...

  4. Tensorflow-gpu在windows10上的安装(anaconda)

    文档来源转载: http://blog.csdn.net/u010099080/article/details/53418159 http://blog.nitishmutha.com/tensorf ...

  5. 自学web前端达到什么水平,才能满足求职的标准?

    大多数野生程序员最棘手的问题就是如何依靠技术解决温饱,通俗来讲就是技术折现的问题. 如果是单纯出于兴趣,或者只是为了突击某一阶段或者某一项目技术壁垒,不跟就业挂钩的自学倒也是无关痛痒.但是当上岗成为自 ...

  6. 常见PHP危险函数及特殊函数

    PHP代码执行函数 - eval & assert & preg_replace mixed eval ( string $code ) 把字符串 $code 作为PHP代码执行. 很 ...

  7. linux-32位-交叉编译openssl

    下载 openssl-1.1.0i.tar.gz ./config no-asm shared –prefix=/usr/local/openssl –cross-compile-prefix=arm ...

  8. vue3.0 + ueditor

    公司有个需求,需要做个发送邮件的模版(富文本对于模版的扩展性更好吧) 关于富文本,也找了一些好看且支持vue的,但是功能都没有百度全面 反正这个系统也是自己人用,颜值无所谓了 关于vue2.0+ued ...

  9. 05 Node.js学习笔记之发送文件数据

    这章学习在NodeJs中如何将Html文件发送到客户端上,以及定义Content-Type内容类型 //1.载入http和fs模块 var http=require("http") ...

  10. 020 - FreeRTOS学习路线总结

    零.为什么写? 在H7-tools预售群里,有位朋友提出如何学习FreeRTOS这类的问题,便由此总结下自己的学习路线.最近又打算接触RTT,和FreeRTOS做个对比. 文章分两步来讲,学习路线和学 ...