Hbase java API 调用详解

Hbase java API
调用

一. hbase的安装

参考:http://blog.csdn.net/mapengbo521521/article/details/41777721

二.hbase访问方式

Native java api:最常规最高效的访问方式。

Hbase shell:hbase的命令行工具,最简单的接口,适合管理员使用

Thrift gateway:利用thrift序列化结束支持各种语言,适合异构系统在线访问

Rest gateway:支持rest风格的http api访问hbase,解除异构系统语言限制。

Mapreduce:直接使用mr作业处理Hbase数据。使用hive、pig处理hbase数据。

三.java api访问Hbase的步骤

1.      创建configuration对象,包含各种配置信息。

Configuration conf=HbaseConfiguration.create();

2.      构建HTabele句柄,需要提供configuration对象和table名称。

HTable table=new HTable(conf,tableName);

3.      指向相应的操作:put,get,delete,scan等操作.

Table.getTableName();

4.      关闭HTable句柄

Table.close();

四.JAVA常用api

  1、 
对表的创建、删除、显示以及修改等,可以用HBaseAdmin,一旦创建了表,那么可以通过HTable的实例来访问表,每次可以往表里增加数据。

  2、  插入数据创建一个Put对象,在这个Put对象里可以指定要给哪个列增加数据,以及当前的时间戳等值,然后通过调用HTable.put(Put)来提交操作,子猴在这里提请注意的是:在创建Put对象的时候,你必须指定一个行(Row)值,在构造Put对象的时候作为参数传入。

  3、  获取数据,使用Get对象,Get对象同Put对象一样有好几个构造函数,通常在构造的时候传入行值,表示取第几行的数据,通过HTable.get(Get)来调用。

  4、  浏览每一行,通过Scan可以对表中的行进行浏览,得到每一行的信息,比如列名,时间戳等,Scan相当于一个游标,通过next()来浏览下一个,通过调用HTable.getScanner(Scan)来返回一个ResultScanner对象。HTable.get(Get)和HTable.getScanner(Scan)都是返回一个Result。Result是一个

KeyValue的链表。

  5、  删除

使用Delete来删除记录,通过调用HTable.delete(Delete)来执行删除操作。(注:删除这里有些特别,也就是删除并不是马上将数据从表中删除。)

  6、  新增、获取、删除在操作过程中会对所操作的行加一个锁,而浏览却不会。

  7、  簇的访问,客户端代码通过ZooKeeper来访问找到簇,也就是说ZooKeeperquorum将被使用,那么相关的类(包)应该在客户端的类(classes)目录下,即客户端一定要找到文件hbase-site.xml。

五.Java demo

packageorg.apache.hadoop.hbase;

importjava.io.IOException;

importorg.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.hbase.client.Delete;

importorg.apache.hadoop.hbase.client.Get;

importorg.apache.hadoop.hbase.client.HBaseAdmin;

importorg.apache.hadoop.hbase.client.HTable;

importorg.apache.hadoop.hbase.client.Put;

importorg.apache.hadoop.hbase.client.Result;

importorg.apache.hadoop.hbase.client.ResultScanner;

importorg.apache.hadoop.hbase.client.Scan;

importorg.apache.hadoop.hbase.util.Bytes;

publicclass Hbase {

// 声明静态配置

static Configuration conf = null;

static {

conf =HBaseConfiguration.create();

conf.set("hbase.zookeeper.quorum","localhost");

}

/*

* 创建表

*

* @tableName
表名

*

* @family 列族列表

*/

public static void creatTable(StringtableName, String[] family)

throws Exception {

HBaseAdmin admin = newHBaseAdmin(conf);

HTableDescriptor desc = newHTableDescriptor(tableName);

for (int i = 0; i <family.length; i++) {

desc.addFamily(newHColumnDescriptor(family[i]));

}

if(admin.tableExists(tableName)) {

System.out.println("tableExists!");

System.exit(0);

} else {

admin.createTable(desc);

System.out.println("createtable Success!");

}

}

/*

* 为表添加数据(适合知道有多少列族的固定表)

*

* @rowKey rowKey

*

* @tableName
表名

*

* @column1
第一个列族列表

*

* @value1 第一个列的值的列表

*

* @column2
第二个列族列表

*

* @value2 第二个列的值的列表

*/

public static void addData(StringrowKey, String tableName,

String[] column1,String[] value1, String[] column2, String[] value2)

throws IOException {

Put put = newPut(Bytes.toBytes(rowKey));//
设置rowkey

HTable table = newHTable(conf, Bytes.toBytes(tableName));// HTabel负责跟记录相关的操作如增删改查等//

//
获取表

HColumnDescriptor[]columnFamilies = table.getTableDescriptor() //
获取所有的列族

.getColumnFamilies();

for (int i = 0; i <columnFamilies.length; i++) {

String familyName =columnFamilies[i].getNameAsString(); //
获取列族名

if(familyName.equals("article")) { // article列族put数据

for (int j= 0; j < column1.length; j++) {

put.add(Bytes.toBytes(familyName),Bytes

.toBytes(column1[j]),Bytes.toBytes(value1[j]));

}

}

if(familyName.equals("author")) { // author列族put数据

for (int j= 0; j < column2.length; j++) {

put.add(Bytes.toBytes(familyName),Bytes

.toBytes(column2[j]),Bytes.toBytes(value2[j]));

}

}

}

table.put(put);

System.out.println("adddata Success!");

}

/*

* 根据rwokey查询

*

* @rowKey rowKey

*

* @tableName
表名

*/

public static Result getResult(StringtableName, String rowKey)

throws IOException {

Get get = newGet(Bytes.toBytes(rowKey));

HTable table = newHTable(conf, Bytes.toBytes(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());

System.out.println("-------------------------------------------");

}

return result;

}

/*

* 遍历查询hbase表

*

* @tableName
表名

*/

public static void getResultScann(StringtableName) throws IOException {

Scan scan = new Scan();

ResultScanner rs = null;

HTable table = newHTable(conf, Bytes.toBytes(tableName));

try {

rs =table.getScanner(scan);

for (Result r : rs){

for(KeyValue kv : r.list()) {

System.out.println("row:"+ Bytes.toString(kv.getRow()));

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());

System.out

.println("-------------------------------------------");

}

}

} finally {

rs.close();

}

}

/*

* 遍历查询hbase表

*

* @tableName
表名

*/

public static voidgetResultScann(String tableName, String start_rowkey,

String stop_rowkey)throws IOException {

Scan scan = new Scan();

scan.setStartRow(Bytes.toBytes(start_rowkey));

scan.setStopRow(Bytes.toBytes(stop_rowkey));

ResultScanner rs = null;

HTable table = newHTable(conf, Bytes.toBytes(tableName));

try {

rs =table.getScanner(scan);

for (Result r : rs){

for(KeyValue kv : r.list()) {

System.out.println("row:"+ Bytes.toString(kv.getRow()));

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());

System.out

.println("-------------------------------------------");

}

}

} finally {

rs.close();

}

}

/*

* 查询表中的某一列

*

* @tableName
表名

*

* @rowKey rowKey

*/

public static voidgetResultByColumn(String tableName, String rowKey,

String familyName,String columnName) throws IOException {

HTable table = newHTable(conf, Bytes.toBytes(tableName));

Get get = newGet(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());

System.out.println("-------------------------------------------");

}

}

/*

* 更新表中的某一列

*

* @tableName
表名

*

* @rowKey rowKey

*

* @familyName
列族名

*

* @columnName
列名

*

* @value 更新后的值

*/

public static void updateTable(StringtableName, String rowKey,

String familyName,String columnName, String value)

throws IOException {

HTable table = newHTable(conf, Bytes.toBytes(tableName));

Put put = newPut(Bytes.toBytes(rowKey));

put.add(Bytes.toBytes(familyName),Bytes.toBytes(columnName), Bytes

.toBytes(value));

table.put(put);

System.out.println("updatetable Success!");

}

/*

* 查询某列数据的多个版本

*

* @tableName
表名

*

* @rowKey rowKey

*

* @familyName
列族名

*

* @columnName
列名

*/

public static voidgetResultByVersion(String tableName, String rowKey,

String familyName,String columnName) throws IOException {

HTable table = newHTable(conf, Bytes.toBytes(tableName));

Get get = newGet(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());

System.out.println("-------------------------------------------");

}

/*

* List<?> results =table.get(get).list(); Iterator<?> it =

* results.iterator(); while (it.hasNext()) {

* System.out.println(it.next().toString()); }

*/

}

/*

* 删除指定的列

*

* @tableName
表名

*

* @rowKey rowKey

*

* @familyName
列族名

*

* @columnName
列名

*/

public static void deleteColumn(StringtableName, String rowKey,

String falilyName,String columnName) throws IOException {

HTable table = newHTable(conf, Bytes.toBytes(tableName));

Delete deleteColumn = newDelete(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 voiddeleteAllColumn(String tableName, String rowKey)

throws IOException {

HTable table = newHTable(conf, Bytes.toBytes(tableName));

Delete deleteAll = newDelete(Bytes.toBytes(rowKey));

table.delete(deleteAll);

System.out.println("allcolumns are deleted!");

}

/*

* 删除表

*

* @tableName
表名

*/

public static void deleteTable(StringtableName) throws IOException {

HBaseAdmin admin = newHBaseAdmin(conf);

admin.disableTable(tableName);

admin.deleteTable(tableName);

System.out.println(tableName+ "is deleted!");

}

public static void main(String[] args)throws Exception {

//
创建表

String tableName ="blog2";

String[] family = {"article", "author" };

creatTable(tableName, family);

//
为表添加数据

String[] column1 = {"title", "content", "tag" };

String[] value1 = {

"HeadFirst HBase",

"HBaseis the Hadoop database. Use it when you need random, realtime read/write accessto your Big Data.",

"Hadoop,HBase,NoSQL"};

String[] column2 = {"name", "nickname" };

String[] value2 = {"nicholas", "lee" };

addData("rowkey1","blog2", column1, value1, column2, value2);

addData("rowkey2","blog2", column1, value1, column2, value2);

addData("rowkey3","blog2", column1, value1, column2, value2);

//
遍历查询

getResultScann("blog2","rowkey4", "rowkey5");

//
根据row key范围遍历查询

getResultScann("blog2","rowkey4", "rowkey5");

//
查询

getResult("blog2","rowkey1");

//
查询某一列的值

getResultByColumn("blog2","rowkey1", "author", "name");

//
更新列

updateTable("blog2","rowkey1", "author", "name", "bin");

//
查询某一列的值

getResultByColumn("blog2","rowkey1", "author", "name");

//
查询某列的多版本

getResultByVersion("blog2","rowkey1", "author", "name");

//
删除一列

deleteColumn("blog2","rowkey1", "author", "nickname");

//
删除所有列

deleteAllColumn("blog2","rowkey1");

//
删除表

deleteTable("blog2");

}

}

时间: 2024-10-22 05:22:44

Hbase java API 调用详解的相关文章

大数据学习系列之三 ----- HBase Java Api 图文详解

引言 在上一篇中大数据学习系列之二 ----- HBase环境搭建(单机) 中,成功搭建了Hadoop+HBase的环境,本文则主要讲述使用Java 对HBase的一些操作. 一.事前准备 1.确认hadoop和hbase成功启动 2.确认防火墙是否关闭 3.maven所需要的依赖架包 <!--hadoop 相关架包 --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>

HBase的JAVA API操作详解

hbase 伪 分 布 安 装参考:http://blog.csdn.net/gamer_gyt/article/details/47126961 hbase shell操作命令参考:http://blog.csdn.net/gamer_gyt/article/details/47131857 数 据 挖 掘 资源链接汇总:http://blog.csdn.net/gamer_gyt/article/details/47747857 其中用到的eclipse快捷键: Alt+/ 代码助手完成一些

转:Java HashMap实现详解

Java HashMap实现详解 转:http://beyond99.blog.51cto.com/1469451/429789 1.    HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 2.    HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造

Java多线程编程详解

线程的同步 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 由于我们可以通过 private 关键字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机制,这套机制就是 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块. 1. synchronized 方法:通过在方法声明中加入 synch

Java串口通信详解(转)

Java串口通信详解(转) 作者:denimcc 日期:2007-05-11 序言    说到开源,恐怕很少有人不挑大指称赞.学生通过开源代码学到了知识,程序员通过开源类库获得了别人的成功经验及能够按时完成手头的工程,商家通过开源软件赚到了钱……,总之是皆大欢喜.然而开源软件或类库的首要缺点就是大多缺乏详细的说明文档和使用的例子,或者就是软件代码随便你用,就是文档,例子和后期服务收钱.                                                        

Java设计模式----观察者模式详解

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3899208.html 联系方式:[email protected] [正文] 一.观察者模式的定义: 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监听一个主题对象.这样一来,当被观察者状态发生改变时,需要通知相应的观察者,使这些观察者对象能够自动更新.例如:GUI中的事件

java异常处理机制详解

java异常处理机制详解 程序很难做到完美,不免有各种各样的异常.比如程序本身有bug,比如程序打印时打印机没有纸了,比如内存不足.为了解决这些异常,我们需要知道异常发生的原因.对于一些常见的异常,我们还可以提供一定的应对预案.C语言中的异常处理是简单的通过函数返回值来实现的,但返回值代表的含义往往是由惯例决定的.程序员需要查询大量的资料,才可能找到一个模糊的原因.面向对象语言,比如C++, Java, Python往往有更加复杂的异常处理机制.这里讨论Java中的异常处理机制. 异常处理 Ja

java 代理模式详解

java 动态代理(JDK和cglib) 设计模式这东东每次看到就明白可过段时间又不能很流利的说出来,今天就用详细的比喻和实例来加深自己的理解(小弟水平不高有不对的地方希望大家能指出来). (1)代理这个词生活中有很多比如在街边卖手机卡.充公交地铁卡的小商店他们都起了代理的作用,java中的代理跟这些小店商的作用是一样的.再比如我想在淘宝上开个服装店但又没有货源怎么办,这时候我就要跟淘宝上某一卖家联系做他的代理.我跟我的商家都要卖衣服(就好比我们都继承了卖衣服的接口sellClothesInte

设计模式 - 迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解

迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式(iterator pattern): http://blog.csdn.net/caroline_wendy/article/details/35254643 Java的标准库(util)中包含迭代器接口(iterator interface), import java.util.Iterator; 继承(