`

HBase之旅三:通过Java Api与HBase交互(转自 Taobao QA Team)

 
阅读更多

引言
HBase提供了Java Api的访问接口,掌握这个就跟Java应用使用RDBMS时需要JDBC一样重要,本文将继续前两篇文章中blog表的示例,介绍常用的Api。
练习前的准备工作

  • 创建一个Maven工程,加入以下依赖:

  • <dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase</artifactId>
    <version>0.90.2</version>
    </dependency>

    如果你的Maven库里还没有hbase,还需要配置下repository
    <repositories>
    <repository>
    <id>cloudera</id>
    <url>https://repository.cloudera.com/content/groups/public</url>
    </repository>
    </repositories>

  • 确保HBase环境已启动且能连接到,将HBase环境的hbase-site.xml文件拷贝到上述工程的src/test/resources目录
  • 加载配置
    Configuration conf = new Configuration();
    // conf.addResource("hbase-site-cluster.xml");//可以指定文件加载
    conf = HBaseConfiguration.create(conf);

    创建表
    /**========创建表=========*/
    HTableDescriptor desc = new HTableDescriptor("blog");
    desc.addFamily(new HColumnDescriptor("article"));
    desc.addFamily(new HColumnDescriptor("author"));
    admin.createTable(desc );

    增加记录
    /**=========插入数据=========*/
    Put put = new Put(Bytes.toBytes("1"));
    put.add(Bytes.toBytes("article"), Bytes.toBytes("title"), Bytes.toBytes("Head First HBase"));
    put.add(Bytes.toBytes("article"), Bytes.toBytes("content"), Bytes.toBytes("HBase is the Hadoop database. Use it when you need random, realtime read/write access to your Big Data."));
    put.add(Bytes.toBytes("article"), Bytes.toBytes("tags"), Bytes.toBytes("Hadoop,HBase,NoSQL"));
    put.add(Bytes.toBytes("author"), Bytes.toBytes("name"), Bytes.toBytes("hujinjun"));
    put.add(Bytes.toBytes("author"), Bytes.toBytes("nickname"), Bytes.toBytes("一叶渡江"));
    table.put(put);

    知识点回顾:RowKey 和 ColumnName 是二进制值(Java 类型 byte[]),value 是一个字节数组(Java类型 byte[])
    根据RowKey查询
    /**=========根据rowkey
    Get get = new Get(Bytes.toBytes("1")); 查询数据=========*/
    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());
    }

    遍历查询与迭代
    /**=========遍历查询=========*/
    Scan scan = new Scan();
    ResultScanner rs =null;
    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()));
        }
      }
    } finally {
      rs.close();
    }

    知识点回顾:HTable的存储结构

    可以看到上面代码我们用了两次for循环来遍历迭代。


    更新练习
    /**=========更新=========*/
    //查询更新前的值
    Get get2 = new Get(Bytes.toBytes("1"));
    get2.addColumn(Bytes.toBytes("author"), Bytes.toBytes("nickname"));
    assertThat(Bytes.toString(table.get(get2).list().get(0).getValue()),is("一叶渡江"));
    //更新nickname为yedu
    Put put2 = new Put(Bytes.toBytes("1")); :
    put2.add(Bytes.toBytes("author"), Bytes.toBytes("nickname"), Bytes.toBytes("yedu"));
    table.put(put2);
    //查询更新结果
    Get get3 = new Get(Bytes.toBytes("1"));
    get3.addColumn(Bytes.toBytes("author"), Bytes.toBytes("nickname"));
    assertThat(Bytes.toString(table.get(get3).list().get(0).getValue()),is("yedu"));
    //查询nickname的多个(本示例为2个)版本值
    Get get4 = new Get(Bytes.toBytes("1"));
    get4.addColumn(Bytes.toBytes("author"), Bytes.toBytes("nickname"));
    get4.setMaxVersions(2);
    List results = table.get(get4).list();
    assertThat(results.size(),is(2));
    assertThat(Bytes.toString(results.get(0).getValue()),is("yedu"));
    assertThat(Bytes.toString(results.get(1).getValue()),is("一叶渡江"));

    删除记录
    /**=========删除记录=========*/
    //删除指定column
    Delete deleteColumn = new Delete(Bytes.toBytes("1"));
    deleteColumn.deleteColumns(Bytes.toBytes("author"),Bytes.toBytes("nickname"));
    table.delete(deleteColumn);
    assertThat( table.get(get4).list(),nullValue());
    //删除所有column
    Delete deleteAll = new Delete(Bytes.toBytes("1"));
    table.delete(deleteAll);
    assertThat(table.getScanner(scan).next(),nullValue());

    删除表
    /**=========删除表=========*/
    admin.disableTable("blog");
    admin.deleteTable("blog");
    assertThat(admin.tableExists("blog"),is(false));

    完整代码示例
    public class HBase {
    public static void main(String[] args) throws IOException {
    Configuration conf = new Configuration();
    // conf.addResource("hbase-site-cluster.xml");//指定文件加载
    conf = HBaseConfiguration.create(conf);
    HBaseAdmin admin = new HBaseAdmin(conf);//HBaseAdmin负责跟表相关的操作如create,drop等
    HTable table = new HTable(conf, Bytes.toBytes("blog"));//HTabel负责跟记录相关的操作如增删改查等
    /**========创建表=========*/
    HTableDescriptor desc = new HTableDescriptor("blog");
    desc.addFamily(new HColumnDescriptor("article"));
    desc.addFamily(new HColumnDescriptor("author"));
    admin.createTable(desc );
    /**=========插入数据=========*/
    Put put = new Put(Bytes.toBytes("1"));
    put.add(Bytes.toBytes("article"), Bytes.toBytes("title"), Bytes.toBytes("Head First HBase"));
    put.add(Bytes.toBytes("article"), Bytes.toBytes("content"), Bytes.toBytes("HBase is the Hadoop database. Use it when you need random, realtime read/write access to your Big Data."));
    put.add(Bytes.toBytes("article"), Bytes.toBytes("tags"), Bytes.toBytes("Hadoop,HBase,NoSQL"));
    put.add(Bytes.toBytes("author"), Bytes.toBytes("name"), Bytes.toBytes("hujinjun"));
    put.add(Bytes.toBytes("author"), Bytes.toBytes("nickname"), Bytes.toBytes("一叶渡江"));
    table.put(put);
    /**=========根据rowkey
    Get get = new Get(Bytes.toBytes("1")); 查询数据=========*/
    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());
    }
    /**=========遍历查询=========*/
    Scan scan = new Scan();
    ResultScanner rs =null;
    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()));
        }
      }
    } finally {
      rs.close();
    }
    /**=========更新=========*/
    //查询更新前的值
    Get get2 = new Get(Bytes.toBytes("1"));
    get2.addColumn(Bytes.toBytes("author"), Bytes.toBytes("nickname"));
    assertThat(Bytes.toString(table.get(get2).list().get(0).getValue()),is("一叶渡江"));
    //更新nickname为yedu
    Put put2 = new Put(Bytes.toBytes("1")); :
    put2.add(Bytes.toBytes("author"), Bytes.toBytes("nickname"), Bytes.toBytes("yedu"));
    table.put(put2);
    //查询更新结果
    Get get3 = new Get(Bytes.toBytes("1"));
    get3.addColumn(Bytes.toBytes("author"), Bytes.toBytes("nickname"));
    assertThat(Bytes.toString(table.get(get3).list().get(0).getValue()),is("yedu"));
    //查询nickname的多个(本示例为2个)版本值
    Get get4 = new Get(Bytes.toBytes("1"));
    get4.addColumn(Bytes.toBytes("author"), Bytes.toBytes("nickname"));
    get4.setMaxVersions(2);
    List results = table.get(get4).list();
    assertThat(results.size(),is(2));
    assertThat(Bytes.toString(results.get(0).getValue()),is("yedu"));
    assertThat(Bytes.toString(results.get(1).getValue()),is("一叶渡江"));
    /**=========删除记录=========*/
    //删除指定column
    Delete deleteColumn = new Delete(Bytes.toBytes("1"));
    deleteColumn.deleteColumns(Bytes.toBytes("author"),Bytes.toBytes("nickname"));
    table.delete(deleteColumn);
    assertThat( table.get(get4).list(),nullValue());
    //删除所有column
    Delete deleteAll = new Delete(Bytes.toBytes("1"));
    table.delete(deleteAll);
    assertThat(table.getScanner(scan).next(),nullValue());
    /**=========删除表=========*/
    admin.disableTable("blog");
    admin.deleteTable("blog");
    assertThat(admin.tableExists("blog"),is(false));
    }
    }

    小结
    本文介绍了Java api创建、删除表,及记录的增删改查,还是以练习为主,也可作为速查手册(比如看如何迭代查询结果),对HBase的基本概念及操作就介绍到这里,后面将介绍如何使用MapReduce对HBase数据进行分布式计算。

    分享到:
    评论

    相关推荐

      通过Java Api与HBase交互

      通过Java Api与HBase交互

      HBase基本操作 Java代码

      HBase基本操作 增删改查 java代码 要使用须导入对应的jar包

      Hbase笔记 —— 利用JavaAPI的方式操作Hbase数据库(往hbase的表中批量插入数据).pdf

      Hbase笔记 —— 利用JavaAPI的方式操作Hbase数据库(往hbase的表中批量插入数据)

      hbase-common-1.4.3-API文档-中文版.zip

      Maven坐标:org.apache.hbase:hbase-common:1.4.3; 标签:apache、common、hbase、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化...

      hbase java api 访问 增加修改删除(一)

      hbase java api 访问 增加修改删除(一) 详情请看:http://blog.csdn.net/wild46cat/article/details/53306621

      实验三:熟悉常用的HBase操作

      A.3实验三:熟悉常用的HBase操作 本实验对应第5章的内容。 A.3.1 实验目的 (1)理解HBase在Hadoop体系结构中的角色。(2)熟练使用HBase操作常用的 Shell命令。(3)熟悉HBase操作常用的 Java API。 A.3.2 实验平台 (1...

      HBase JavaAPI开发

      使用JavaAPI实现HBase的ddl(创建表、删除表、修改表(添加列族等))、dml(添加数据、删除数据)、dql(查询数据(get、scan))等操作 除此之外还包含一些其他操作:命名空间的应用、快照的应用等 对应(《HBase...

      HBase 1.2.0 Javadoc API CHM

      自行制作的HBase 1.2.0 Javadoc API CHM版本。内容抽取自官方站点网页

      HBase Java API类介绍

      HBase Java API类介绍

      使用Java API连接虚拟机HBase并进行数据库操作,Java源代码

      使用Java API连接虚拟机HBase并进行数据库操作,Java源代码

      hbase资料api

      HBASE

      hbase-metrics-api-1.4.3-API文档-中文版.zip

      Maven坐标:org.apache.hbase:hbase-metrics-api:1.4.3; 标签:apache、metrics、api、hbase、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容...

      HBase与MapReduce处理操作(基于JavaAPI)

      该案例中主要使用MapReduce作为处理组件进行数据处理,实现的案例有如通过javaapi实现hbase数据写入hdfs、hbase表数据复制到另一个表中等操作 对应(《HBase分布式存储系统应用》胡鑫喆 张志刚著)教材中案例

      hbase-annotations-1.1.2-API文档-中文版.zip

      Maven坐标:org.apache.hbase:hbase-annotations:1.1.2; 标签:apache、annotations、hbase、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。...

      Java通过api 操作hbase 0.98

      在集群中创建java项目调用api来操作hbase,主要涉及对hbase的创建表格,删除表格,插入数据,删除数据,查询一条数据,查询所有数据等操作。 具体流程如下: 1.创建项目 2.获取jar包到项目的lib目录下(这边试用的事...

      Hbase的JavaAPI

      Hbase的JavaAPI 包括表的增删改查

      javaApi_sparkhiveAPI_hbaseAPI.zip

      2019-8____2019-10工作期间的java版hiveApi,hbaseApi和spark版本的hiveApi,hbaseApi

      Hbase JAVA编程开发实验

      Hbase JAVA编程开发实验报告以及代码,1 按照“Hbase应用开发实验1.pdf”中给出的说明,完成相关相关实验及JAVA程序的编写、调试和运行,提交JAVA源程序(AccessObject.java, HBaseTester.java, User.java)及运行...

      hbase-client-1.2.12-API文档-中文版.zip

      Maven坐标:org.apache.hbase:hbase-client:1.2.12; 标签:apache、hbase、client、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,...

      hbase-client-1.4.3-API文档-中文版.zip

      Maven坐标:org.apache.hbase:hbase-client:1.4.3; 标签:apache、client、hbase、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化...

    Global site tag (gtag.js) - Google Analytics