文档章节

HBase–常用API操作篇

Circleblog
 Circleblog
发布于 2016/07/21 17:06
字数 857
阅读 103
收藏 0

【常用到的几个类】

1. org.apache.hadoop.hbase.HBaseConfiguration

每一个hbase client都会使用到的对象,它代表的是HBase配置信息。它有两种构造方式:

public HBaseConfiguration()
public HBaseConfiguration(final Configuration c)

默认的构造方式会尝试从hbase-default.xml和hbase-site.xml中读取配置。如果classpath没有这两个文件,就需要你自己设置配置。

Configuration HBASE_CONFIG = new Configuration();
HBASE_CONFIG.set(“hbase.zookeeper.quorum”, “zkServer”);
HBASE_CONFIG.set(“hbase.zookeeper.property.clientPort”, “2181″);
HBaseConfiguration cfg = new HBaseConfiguration(HBASE_CONFIG);

 

  

2. org.apache.hadoop.hbase.client.HBaseAdmin
提供了一个接口来管理HBase数据库的表信息。它提供的方法包括:创建表,删除表,列出表项,使表有效或无效,以及添加或删除表列族成员等。

  

3. org.apache.hadoop.hbase.HTableDescriptor 
包含了表的名字极其对应表的列族。 
常用方法:void addFamily(HcolumnDescriptor family) 添加一个列族。其详细用法如下所示,向tb_user表中添加了一个content列族。

HTableDescriptor tableDescriptor = new HTableDescriptor("tb_user");  
HColumnDescriptor col = new HColumnDescriptor("content:");  
tableDescriptor.addFamily(col);  

  
4. org.apache.hadoop.hbase.HColumnDescriptor 
作用:维护着关于列族的信息,例如版本号,压缩设置等。它通常在创建表或者为表添加列族的时候使用。列族被创建后不能直接修改,只能通过删除然后重新创建的方式。列族被删除的时候,列族里面的数据也会同时被删除。
  
5. org.apache.hadoop.hbase.client.HTable 
作用:可以用来和HBase表直接通信。此方法对于更新操作来说是非线程安全的。 

 

  

6. org.apache.hadoop.hbase.client.Put 
作用:用来对单个行执行添加操作。

  
7. org.apache.hadoop.hbase.client.Get 
作用:用来获取单个行的相关信息

   

【实战】

package com.youku.test;

import java.util.Iterator;
import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HBaseConfiguration;
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;
import org.junit.Before;
import org.junit.Test;

/**
 * HBase Java API Test Demo.
 */
public class HbaseDemo {

       private Configuration conf = null;

       /**
        * 初始化
        */
       @Before
       public void init() {
              conf = HBaseConfiguration.create();
              conf.set("hbase.zookeeper.quorum", "zk01,zk02,zk03");
       }

       /**
        * 删除表
        * @throws Exception
        */
       @Test
       public void testDrop() throws Exception {
              HBaseAdmin admin = new HBaseAdmin(conf);
              admin.disableTable("yk_test");
              admin.deleteTable("yk_test");
              admin.close();
       }

       /**
        * 插入数据
        * @throws Exception
        */
       @Test
       public void testPut() throws Exception {
              HTable table = new HTable(conf, "person_info");
              Put p = new Put(Bytes.toBytes("person_rk_bj_zhang_000002"));
              p.add("base_info".getBytes(), "name".getBytes(), "zhangwuji".getBytes());
              table.put(p);
              table.close();
       }

       /**
        * 删除某列
        * @throws Exception
        */
       @Test
       public void testDel() throws Exception {
              HTable table = new HTable(conf, "user");
              Delete del = new Delete(Bytes.toBytes("rk0001"));
              del.deleteColumn(Bytes.toBytes("data"), Bytes.toBytes("pic"));
              table.delete(del);
              table.close();
       }

       /**
        * 单条查询
        * @throws Exception
        */
       @Test
       public void testGet() throws Exception {
              HTable table = new HTable(conf, "person_info");
              Get get = new Get(Bytes.toBytes("person_rk_bj_zhang_000001"));
              get.setMaxVersions(5);
              Result result = table.get(get);

              List<Cell> cells = result.listCells();

              for (Cell c : cells) {
              }

              // result.getValue(family, qualifier); 可以从result中直接取出一个特定的value
              // 遍历出result中所有的键值对
              List<KeyValue> kvs = result.list();
              // kv ---> f1:title:superise.... f1:author:zhangsan f1:content:asdfasldgkjsldg
              for (KeyValue kv : kvs) {
                     String family = new String(kv.getFamily());
                     System.out.println(family);
                     String qualifier = new String(kv.getQualifier());
                     System.out.println(qualifier);
                     System.out.println(new String(kv.getValue()));

              }
              table.close();
       }

       /***
        * 遍历表
        * @throws Exception
        */
       @Test
       public void testScan() throws Exception {
              HTable table = null;
              try {
                     table = new HTable(conf, "person_info");
                     Scan scan = new Scan();
                     scan.addFamily(Bytes.toBytes("v"));
                     ResultScanner rs = table.getScanner(scan);
                     Iterator<Result> it = rs.iterator();

                     while (it.hasNext()) {
                            Result result = it.next();
                            if (result != null && result.size() > 0) {
                                   byte[] row = result.getRow();
                                   String rowStr = Bytes.toString(row); // rowkey
                                   System.out.println("rowkey:" + rowStr);
                                   byte[] value = result.getValue(Bytes.toBytes("v"), Bytes.toBytes("c"));
                                   if(value != null){
                                          long count = Bytes.toLong(value); // value
                                          System.out.println("colum value:" + count);
                                   }
                                   
                            }
                     }
              } catch (Exception e) {
                     e.printStackTrace();
              } finally {
                     if (table != null) {
                            try {
                                   table.close();
                            } catch (Exception e2) {
                                   e2.printStackTrace();
                            }
                     }
              }
       }

【补充说明】

在使用scan操作时,由于HBase表一般很大,往往需要结合过滤器使用,详细参考《HBase--常用过滤器篇》,另外,若在scan时指定了startRow和stopRow时,结果不包含stopRow,但是包含startRow,且startRow和stopRow支持部分匹配,实际应用中若rowkey设计比较复杂,由多部分组成,可以用这种方式查询符合条件的行。

 

更多精彩内容,请访问:圈里圈外

© 著作权归作者所有

Circleblog
粉丝 3
博文 11
码字总数 15216
作品 0
海淀
程序员
私信 提问
HBase应用实践专场-HBase问题排查思路

HBCK - HBCK检查什么? (1)HBase Region一致性 集群中所有region都被assign,而且deploy到唯一一台RegionServer上 该region的状态在内存中、hbase:meta表中以及zookeeper这三个地方需要保持一...

HBase技术社区
2018/09/03
0
0
Apache HBase 1.2.5 发布,分布式数据库

Apache HBase 1.2.5 发布了,HBase 1.2.5 是 HBase 1.2 系列的最新维护版本,主要是为 Hadoop 和 NoSQL 社区带来稳定可靠的数据库。此版本包含自 1.2.4 版本发布以来的 50 多个已解决的问题。...

局长
2017/03/28
972
1
分布式数据库 Apache HBase 2.0.0 第二个 Beta 版发布

Apache HBase 2.0.0 的第二个 Beta 版已发布,Apache HBase 2.0.0-beta-2 是 2.0 版本的非生产预览版,包含之前 alpha 版本中的所有新特性 (new assignment manager, offheap read/write pa...

局长
2018/03/08
1K
0
HBase实操 | 使用Spark通过BulkLoad快速导入数据到HBase

HBase社区直播本期分享专家:明惠(网名:过往记忆)-阿里云数据架构师 视频地址: https://yq.aliyun.com/live/590?spm=a2c4e.11155435.0.0.460177969kCLxf PPT地址: https://yq.aliyun.com/...

hbase小能手
2018/11/16
0
0
手把手教你配置Hbase完全分布式环境

HBase配置相对比较简单,下面的教程也是基于我上面2篇Hadoop配置的环境下继续往下添加HBase的分布式配置,这次我的HBase安装目录放在跟Hadoop同一目录下面,节点信息跟我前一篇Hadoop完全分布...

loki_lan
2014/11/24
11.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

JAVA 编写redisUtils工具类,防止高并发获取缓存出现并发问题

import lombok.extern.slf4j.Slf4j;import org.springframework.data.redis.core.BoundHashOperations;import org.springframework.data.redis.core.BoundValueOperations;import org.......

huangkejie
46分钟前
5
0
JMM内存模型(一)&volatile关键字的可见性

在说这个之前,我想先说一下计算机的内存模型: CPU在执行的时候,肯定要有数据,而数据在内存中放着呢,这里的内存就是计算机的物理内存,刚开始还好,但是随着技术的发展,CPU处理的速度越...

走向人生巅峰的大路
今天
97
0
你对AJAX认知有多少(2)?

接着昨日内容,我们几天继续探讨ajax的相关知识点 提到ajax下面几个问题又是必须要了解的啦~~~ 8、在浏览器端如何得到服务器端响应的XML数据。 通过XMLHttpRequest对象的responseXMl属性 9、 ...

理性思考
今天
5
0
正则表达式基础(一)

1.转义 转义的作用: 当某个字符在表达式中具有特殊含义,例如字符串引号中出现了引号,为了可以使用这些字符本身,而不是使用其在表达式中的特殊含义,则需要通过转义符“\”来构建该字符转...

清自以敬
今天
4
0
idea中@Data标签getset不起作用

背景:换电脑以后在idea中有@data注解都不生效 解决办法:idea装个插件 https://blog.csdn.net/seapeak007/article/details/72911529...

栾小糖
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部