`

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数据进行分布式计算。

    分享到:
    评论

    相关推荐

      HBase基本操作 Java代码

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

      Hbase调用JavaAPI实现批量导入操作

      要使用Java API与HBase交互,首先需要在项目中引入HBase的依赖库,例如通过Maven或Gradle。主要涉及的类有`HBaseConfiguration`, `HTable`, `Put`和`BatchOperation`等。`HBaseConfiguration`用于配置HBase连接参数...

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

      通过Java API,我们可以方便地在应用程序中与HBase交互。 首先,让我们了解HBase的基本概念。HBase是列式存储的,这意味着数据按照列族(Column Family)和列(Qualifier)来组织。每个单元格(Cell)都有一个...

      javaApi_sparkhiveAPI_hbaseAPI.zip

      本压缩包"javaApi_sparkhiveAPI_hbaseAPI.zip"包含了2019年8月至10月期间针对这些技术的Java版API实现,以及与Spark相关的Hive和HBase API。以下是关于这些技术的详细知识: 1. **Java API for Hive**: - **Hive*...

      Hadoop+HBase+Java API

      标题 "Hadoop+HBase+Java API" 涉及到三个主要的开源技术:Hadoop、HBase以及Java API,这些都是大数据处理和存储领域的关键组件。以下是对这些技术及其结合使用的详细介绍: **Hadoop** 是一个分布式计算框架,由...

      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 访问 查询、分页

      在Java API中,我们主要通过`org.apache.hadoop.hbase.client.Connection`和`org.apache.hadoop.hbase.client.Table`这两个核心类来进行交互。 1. **连接HBase**: 使用`ConnectionFactory.createConnection...

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

      通过Java API,我们可以方便地与HBase交互,实现数据的增、删、改、查等操作。 首先,确保你的开发环境已经配置了HBase的Java客户端库。这通常可以通过在`pom.xml`(如果你使用的是Maven)或`build.gradle`(如果你...

      HBase Java API类介绍

      HBase提供了Java API供开发者使用,以便更方便地与HBase进行交互。本文将详细介绍HBase Java API中的几个核心类及其功能。 #### 二、HBase Java API类介绍 ##### 1. HBaseConfiguration **关系**:`org.apache....

      hbase java api 所需最精简 jar

      总的来说,了解并正确使用HBase的Java API对于Java开发者来说至关重要,这不仅能帮助他们理解如何与分布式数据库交互,还能为大数据处理提供高效和可靠的解决方案。在实际开发中,根据项目的具体需求选择合适的JAR包...

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

      在本文档中,我们将深入探讨如何使用Java API与HBase数据库进行交互,特别是关于如何创建表、修改表结构以及批量插入数据。HBase是Apache的一个分布式、可扩展的大数据存储系统,它基于谷歌的Bigtable设计,适用于...

      java操作Hbase之从Hbase中读取数据写入hdfs中源码

      在Java编程环境中,操作HBase并将其数据写入HDFS(Hadoop Distributed File System)是一项常见的任务,特别是在大数据处理和分析的场景下。本篇将详细介绍如何使用Java API实现这一功能,以及涉及到的关键技术和...

      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资料api

      HBase数据查询API HBase是一种分布式的、面向列的NoSQL数据库,主要应用于存储大量的半结构化数据。HBase提供了多种查询方式,包括单条查询和批量查询。 单条查询 单条查询是通过rowkey在table中查询某一行的数据...

      Hbase Java API

      HBase Java API HBase 是 Hadoop 的数据库,能够对大数据提供随机、实时读写访问。他是开源的,分布式的,多版本的,面向列...HBase 的 Java API 提供了多种方法来操作数据和管理表结构,是大数据处理的重要工具之一。

      hbase常用JAVA API

      在Java中,我们可以使用HBase的Java API来与HBase交互,进行数据的读写操作。下面将详细介绍HBase Java API的核心概念和常用方法。 1. **连接HBase** 要连接到HBase,你需要创建一个`Configuration`对象,然后通过...

      如何使用Java API操作Hbase(基于0.96新的api)

      本篇文章将深入探讨如何使用Java API与HBase进行交互。 首先,我们需要了解HBase的主要组件: 1. **表(Table)**:HBase中的数据存储在表中,表由行和列族组成。 2. **行(Row)**:行由行键(Row Key)唯一标识...

      java api 访问hbase demo(Maven)

      在这个Java API访问HBase的Maven项目中,我们将探讨如何配置项目,引入依赖,以及编写Java代码来与HBase进行交互。 首先,我们需要在项目中集成Maven,Maven是一个项目管理和综合工具,它可以帮助我们管理项目的...

    Global site tag (gtag.js) - Google Analytics