如何使用Java API读写Hbase

news/2024/5/20 5:09:27 标签: hbase, java, Java API读写Hbase, HDFS
[b][color=olive][size=large]Hbase是够建在HDFS之上的半结构化的分布式存储系统,具有HDFS的所有优点,同时也有自己的亮点,支持更快速的随机读写以及更灵活的Scan操作,而在HDFS上这一点我们是远远做不到的,因为HDFS仅支持Append追加操作,而且也不具备随机读写一条数据的功能,实际上HDFS扫描的范围按Block来算的,所以从某个角度来言,Hbase利用Schemal的方式做到了这一点。[/size][/color][/b]

[b][color=green][size=large]一般情况下,我们使用Linux的shell命令,就可以非常轻松的操作Hbase,例如一些建表,建列簇,插值,显示所有表,统计数量等等,但有时为了提高灵活性,我们也需要使用编程语言来操作Hbase,当然Hbase通过Thrift接口提供了对大多数主流编程语言的支持,例如C++,PHP,Python,Ruby等等,那么本篇,散仙给出的例子是基于Java原生的API操作Hbase,相比其他的一些编程语言,使用Java操作Hbase,会更加高效一些,因为Hbase本身就是使用Java语言编写的。[/size][/color][/b]

[b][color=olive][size=large]下面,散仙给出源码,以供参考:[/size][/color][/b]

java">package com.hbase;

import java.util.ArrayList;
import java.util.List;

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.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;

/**
* @author 三劫散仙
*
* **/
public class Test {

static Configuration conf=null;
static{

conf=HBaseConfiguration.create();//hbase的配置信息
conf.set("hbase.zookeeper.quorum", "10.2.143.5"); //zookeeper的地址

}

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

Test t=new Test();
//t.createTable("temp", new String[]{"name","age"});
//t.insertRow("temp", "2", "age", "myage", "100");
// t.getOneDataByRowKey("temp", "2");
t.showAll("temp");

}

/***
* 创建一张表
* 并指定列簇
* */
public void createTable(String tableName,String cols[])throws Exception{
HBaseAdmin admin=new HBaseAdmin(conf);//客户端管理工具类
if(admin.tableExists(tableName)){
System.out.println("此表已经存在.......");
}else{
HTableDescriptor table=new HTableDescriptor(tableName);
for(String c:cols){
HColumnDescriptor col=new HColumnDescriptor(c);//列簇名
table.addFamily(col);//添加到此表中
}

admin.createTable(table);//创建一个表
admin.close();
System.out.println("创建表成功!");
}
}

/**
* 添加数据,
* 建议使用批量添加
* @param tableName 表名
* @param row 行号
* @param columnFamily 列簇
* @param column 列
* @param value 具体的值
*
* **/
public void insertRow(String tableName, String row,
String columnFamily, String column, String value) throws Exception {
HTable table = new HTable(conf, tableName);
Put put = new Put(Bytes.toBytes(row));
// 参数出分别:列族、列、值
put.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column),
Bytes.toBytes(value));

table.put(put);
table.close();//关闭
System.out.println("插入一条数据成功!");
}

/**
* 删除一条数据
* @param tableName 表名
* @param row rowkey
* **/
public void deleteByRow(String tableName,String rowkey)throws Exception{
HTable h=new HTable(conf, tableName);
Delete d=new Delete(Bytes.toBytes(rowkey));
h.delete(d);//删除一条数据
h.close();
}

/**
* 删除多条数据
* @param tableName 表名
* @param row rowkey
* **/
public void deleteByRow(String tableName,String rowkey[])throws Exception{
HTable h=new HTable(conf, tableName);

List<Delete> list=new ArrayList<Delete>();
for(String k:rowkey){
Delete d=new Delete(Bytes.toBytes(k));
list.add(d);
}
h.delete(list);//删除
h.close();//释放资源
}

/**
* 得到一条数据
*
* @param tableName 表名
* @param rowkey 行号
* ***/
public void getOneDataByRowKey(String tableName,String rowkey)throws Exception{
HTable h=new HTable(conf, tableName);

Get g=new Get(Bytes.toBytes(rowkey));
Result r=h.get(g);
for(KeyValue k:r.raw()){

System.out.println("行号: "+Bytes.toStringBinary(k.getRow()));
System.out.println("时间戳: "+k.getTimestamp());
System.out.println("列簇: "+Bytes.toStringBinary(k.getFamily()));
System.out.println("列: "+Bytes.toStringBinary(k.getQualifier()));
//if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){
// System.out.println("值: "+Bytes.toInt(k.getValue()));
//}else{
String ss= Bytes.toString(k.getValue());
System.out.println("值: "+ss);
//}



}
h.close();


}

/**
* 扫描所有数据或特定数据
* @param tableName
* **/
public void showAll(String tableName)throws Exception{

HTable h=new HTable(conf, tableName);

Scan scan=new Scan();
//扫描特定区间
//Scan scan=new Scan(Bytes.toBytes("开始行号"),Bytes.toBytes("结束行号"));
ResultScanner scanner=h.getScanner(scan);
for(Result r:scanner){
System.out.println("==================================");
for(KeyValue k:r.raw()){

System.out.println("行号: "+Bytes.toStringBinary(k.getRow()));
System.out.println("时间戳: "+k.getTimestamp());
System.out.println("列簇: "+Bytes.toStringBinary(k.getFamily()));
System.out.println("列: "+Bytes.toStringBinary(k.getQualifier()));
//if(Bytes.toStringBinary(k.getQualifier()).equals("myage")){
// System.out.println("值: "+Bytes.toInt(k.getValue()));
//}else{
String ss= Bytes.toString(k.getValue());
System.out.println("值: "+ss);
//}



}
}
h.close();

}

}

[b][color=olive][size=large]显示所有数据的打印输出如下:[/size][/color][/b]
java">==================================
行号: 1
时间戳: 1385597699287
列簇: name
列: myname
值: 秦东亮
==================================
行号: 2
时间戳: 1385598393306
列簇: age
列: myage
值: 100
行号: 2
时间戳: 1385597723900
列簇: name
列: myname
值: 三劫散仙



[b][color=olive][size=large]由此,可以看出Hbase的对外的API提供接口,是非常简单易用的。[/size][/color][/b]

http://www.niftyadmin.cn/n/790327.html

相关文章

openstack组件的数据库操作

一、基础 SQLAlchemy http://docs.sqlalchemy.org/en/rel_0_9/index.html 对数据库进行操作的工具&#xff1a;xxx-manage db ... 二、数据库表的创建和修改 使用SQLAlchemy-SQL Expression Language&#xff1a; http://sqlalchemy.readthedocs.org/en/rel_0_9/core/tutorial.…

九句良言胜敲十年代码

[b][colorgreen][sizelarge]此刻&#xff0c;夜深人静&#xff0c;时间已超过凌晨零点&#xff0c;散仙还在读[urlhttp://blog.csdn.net/ricohzhanglong/article/details/6475258]张龙[/url]老师的一篇博客&#xff0c;特别是读到如下的一段话&#xff0c;感触颇深&#xff0c;…

redis cluster集群进行和SSM整合

redis cluster集群和SSM整合&#xff0c;用两种方式来实现整合 手动方式(也是客户端(JedisCluster )的方式来实现) 关于手动方式请参考SpringMybatisredis整合(用依赖注入的方式手动修改缓存) redis.properties redis.pool.maxTotal30 redis.pool.maxIdle10 redis.pool.numTe…

UIView 动画的参数传递 与 自定义方法

1.UIView 动画可以传递参数的地方有三个&#xff1a; 1 (void)beginAnimations:(NSString *)animationID context:(void *)context 2 3 (void)setAnimationWillStartSelector:(SEL)selector; // default NULL. -animationWillStart:(NSString *)animatio…

MongoDB下载安装,可视化工具下载安装基本操作(一)

学完了redis&#xff0c;也了解redis的在项目中的位置和作用&#xff0c;那肯定也要学习另一个NoSQL了&#xff0c;那就是MongoDB 关于它俩的区别请参考MongoDB和Redis的区别 现在开始新的旅程吧 MongoDB的安装 windwos安装步骤请参考https://www.runoob.com/mongodb/mongodb…

一些常用的正则表达式

[b][colorgreen][sizelarge] "^\d$"  //非负整数&#xff08;正整数 0&#xff09; "^[0-9]*[1-9][0-9]*$"  //正整数 "^((-\d)|(0))$"  //非正整数&#xff08;负整数 0&#xff09; "^-[0-9]*[1-9][0-9]*$"  //负整数 …

MongonDB中数据库,集合,文档三者的区简单介绍(二)

客户端连接 盘符:\MongoDB\Server\4.0\bin>mongo数据库 MongoDB和MySQL一样&#xff0c;可以建立多个数据库&#xff0c;不同的数据库里可以放置不同的文件&#xff0c; MongoDB里的集合就是MySQL里的表&#xff0c;用可视化工具MongoDB Compass可以把集合转换成table Mon…

分布式助手Zookeeper(一)

[b][colorolive][sizelarge]Zookeeper最早是Hadoop的一个子项目&#xff0c;主要为Hadoop生态系统中一些列组件提供统一的分布式协作服务&#xff0c;在2010年10月升级成Apache Software Foundation(ASF)顶级项目&#xff0c;它主要提供以下的四个功能&#xff1a; [table] |功…