hbase+java+更新数据_Java API连接HBase 进行增删查改操作

准备工作

(1).创建maven工程,添加以下依赖,导入jar包

org.apache.hbase

hbase-client

1.2.6

org.apache.hbase

hbase-server

1.2.6

(2) 创建hbase-site.xml文件配置hbase的连接信息

hbase.zookeeper.quorum

master,slave1,slave2

The directory shared by RegionServers.

hbase.zookeeper.property.clientport

2181

(3) 打开hbase服务,准备工作完成。

2. 通过configuration获取hbase连接

public Connection connection;

// 用HBaseconfiguration初始化配置信息是会自动加载当前应用的classpath下的hbase-site.xml

public static Configuration configuration = HBaseConfiguration.create();

public HbaseTest() throws Exception {

// 对connection进行初始化、

// 当然也可以手动加载配置文件,手动加载配置文件时要调用configuration的addResource方法

// configuration.addResource("hbase-site.xml");

connection = ConnectionFactory.createConnection(configuration);

3 、 通过java API创建表、删除表

获取连接后就可以通过API操作HBase了,对表的操做是通过Admin类的方法进行操作的。

public void createTable(String tableName , String... cf1)throws Exception{

Admin admin = connection.getAdmin();

//HTD需要TableName类型的tableName,创建TableName类型的tableName

TableName tbName = TableName.valueOf(tableName);

//判断表述否已存在,不存在则创建表

if(admin.tableExists(tbName)){

System.err.println("表" + tableName + "已存在!");

return;

}

//通过HTableDescriptor创建一个HTableDescriptor将表的描述传到createTable参数中

HTableDescriptor HTD = new HTableDescriptor(tbName);

//为描述器添加表的详细参数

for(String cf : cf1){

// 创建HColumnDescriptor对象添加表的详细的描述

HColumnDescriptor HCD =new HColumnDescriptor(cf);

HTD.addFamily(HCD);

//调用createtable方法创建表

admin.createTable(HTD);

}

删除表

public void deleteTable(String tableName) throws Exception {

Admin admin = connection.getAdmin();

//通过tableName创建表名

TableName tbName = TableName.valueOf(tableName);

//判断表是否存在,若存在就删除,不存在就退出

if (admin.tableExists(tbName)) {

//首先将表解除占用,否则无法删除

admin.disableTable(tbName);

//调用delete方法

admin.deleteTable(tbName);

System.err.println("表" + tableName + "已删除");

}else{

System.err.println("表" + tableName + "不存在!");

}

}

}

向表中写入数据

操作表中的数据要用Table类下的方法,写入数据要调用put方法

public void putData() throws Exception{

//通过表名获取tbName

TableName tbname = TableName.valueOf("bd14:fromJava");

//通过connection获取相应的表

Table table =connection.getTable(tbname);

//创建Random对象以作为随机参数

Random random = new Random();

//hbase支持批量写入数据,创建Put集合来存放批量的数据

List batput = new ArrayList<>();

//循环10次,创建10组测试数据放入list中

for(int i=0;i<10;i++){

//实例化put对象,传入行键

Put put =new Put(Bytes.toBytes("rowkey_"+i));

//调用addcolum方法,向i簇中添加字段

put.addColumn(Bytes.toBytes("i"), Bytes.toBytes("username"),Bytes.toBytes("un_"+i));

put.addColumn(Bytes.toBytes("i"), Bytes.toBytes("age"),Bytes.toBytes(random.nextInt(50)+1));

put.addColumn(Bytes.toBytes("i"), Bytes.toBytes("birthday"),Bytes.toBytes("2017"+i));

put.addColumn(Bytes.toBytes("i"), Bytes.toBytes("phone"),Bytes.toBytes("phone:"+i));

put.addColumn(Bytes.toBytes("i"), Bytes.toBytes("邮箱"),Bytes.toBytes("邮箱:"+i));

//将测试数据添加到list中

batput.add(put);

}

//调用put方法将list中的测试数据写入hbase

table.put(batput);

System.err.println("数据插入完成!");

}

查询数据

方法1:使用CellScanner类遍历数据表

public void getData() throws Exception{

//获取想要查询的表的TableName

TableName tbname = TableName.valueOf("bd14:fromJava");

//通过tbName获得Table对象

Table table =connection.getTable(tbname);

//创建Get的集合以承接查询的条件

List gets = new ArrayList<>();

//循环五次,取前五个测试数据

for(int i=0;i<5;i++){

//就将查询条件放入get对象中

Get get = new Get(Bytes.toBytes("rowkey_"+i));

//将get对象放入聚合

gets.add(get);

}

//调用table.get方法传入查询条件,获得查询的结果的数组

Result[] results = table.get(gets);

//遍历结果数组,利用CellScanner配合cellUtil获得对应的数据

for (Result result : results) {

//调用result.cellscanner创建scanner对象

CellScanner cellScanner = result.cellScanner();

//遍历结果集,取出查询结果,

//如果存在下一个cell则advandce方法返回true,且current方法会返回一个有效的cell,可以当作循环条件

while (cellScanner.advance()) {

//current方法返回一个有效的cell

Cell cell = cellScanner.current();

//使用CellUtil调用相应的方法获取想用的数据,并利用Bytes.toString方法将结果转换为string输出

String family = Bytes.toString(CellUtil.cloneFamily(cell));

String qualify = Bytes.toString(CellUtil.cloneQualifier(cell));

String rowkey = Bytes.toString(CellUtil.cloneRow(cell));

String value = Bytes.toString(CellUtil.cloneValue(cell));

System.err.println(family+"_"+qualify+"_"+rowkey+"_"+value);

}

}

}

方法 2: 通过getmap方法获取结果集,并循环遍历map获取数据

public void getData() throws Exception{

TableName tbname = TableName.valueOf("bd14:fromJava");

Table table =connection.getTable(tbname);

List gets = new ArrayList<>();

for(int i=0;i<5;i++){

Get get = new Get(Bytes.toBytes("rowkey_"+i));

gets.add(get);

}

Result[] results = table.get(gets);

for (Result result : results) {

NavigableMap>> map = result.getMap();

for(byte[] cf : map.keySet()){

NavigableMap> valueWithColumnQualify = map.get(cf);

for(byte[] columnQualify:valueWithColumnQualify.keySet()){

NavigableMap valueWithTimestamp = valueWithColumnQualify.get(columnQualify);

for (Long ts : valueWithTimestamp.keySet()) {

byte[] value = valueWithTimestamp.get(ts);

String rowKey = Bytes.toString(result.getRow());

String columnFamily = Bytes.toString(cf);

String columnqualify = Bytes.toString(columnQualify);

String timestamp =new Date(ts)+"";

String values = Bytes.toString(columnQualify);

System.out.println(rowKey+"-"+columnFamily+"-"+columnqualify+"-"+timestamp+"-"+values);

}

}

}

}

方法 3:嵌套遍历结果对象,利用CellUtil获取数据

public void getData() throws Exception{

TableName tbname = TableName.valueOf("bd14:fromJava");

Table table =connection.getTable(tbname);

List gets = new ArrayList<>();

for(int i=0;i<5;i++){

Get get = new Get(Bytes.toBytes("rowkey_"+i));

gets.add(get);

}

Result[] results = table.get(gets);

//遍历结果对象results

for (Result result : results) {

//嵌套遍历result获取cell

for(Cell cell : result.listCells()){

//使用CellUtil工具类直接获取cell中的数据

String family = Bytes.toString(CellUtil.cloneFamily(cell));

String qualify = Bytes.toString(CellUtil.cloneQualifier(cell));

String rowkey = Bytes.toString(CellUtil.cloneRow(cell));

String value = Bytes.toString(CellUtil.cloneValue(cell));

System.err.println(family+"_"+qualify+"_"+rowkey+"_"+value);

}

}

}

方法 4:根据rowkey和column获取相应的数据

public void getData() throws Exception{

TableName tbname = TableName.valueOf("bd14:fromJava");

Table table =connection.getTable(tbname);

Get get = new Get(Bytes.toBytes("rowkey_"+i));

Result result = table.get(get);

//遍历结果对象results

for (Result result : results) {

//嵌套遍历result获取cell

for(Cell cell : result.listCells()){

//使用CellUtil工具类直接获取cell中的数据

String family = Bytes.toString(CellUtil.cloneFamily(cell));

String qualify = Bytes.toString(CellUtil.cloneQualifier(cell));

String rowkey = Bytes.toString(CellUtil.cloneRow(cell));

String value = Bytes.toString(CellUtil.cloneValue(cell));

System.err.println(family+"_"+qualify+"_"+rowkey+"_"+value);

}

}

}

更新数据

public void updateData(String tableName,String rowKey,String family, String columkey,String updatedata) throws Exception{

//hbase中更新数据同样采用put方法,在相同的位置put数据,则在查询时只会返回时间戳较新的数据

//且在文件合并时会将时间戳较旧的数据舍弃

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

//将新数据添加到put中

put.addColumn(Bytes.toBytes(family), Bytes.toBytes(columkey),Bytes.toBytes(updatedata));

Table table = connection.getTable(TableName.valueOf(tableName));

//将put写入HBase

table.put(put);

}

删除数据

//删除某条记录

public void deleteData(String tableName,String rowKey,String family, String columkey) throws Exception{

Table table = connection.getTable(TableName.valueOf(tableName));

//创建delete对象

Delete deletData= new Delete(Bytes.toBytes(rowKey));

//将要删除的数据的准确坐标添加到对象中

deletData.addColumn(Bytes.toBytes(family), Bytes.toBytes(columkey));

//删除表中数据

table.delete(deletData);

}

//删除一行数据

public void deleteRow(String tableName,String rowKey) throws Exception{

Table table = connection.getTable(TableName.valueOf(tableName));

//通过行键删除一整行的数据

Delete deletRow= new Delete(Bytes.toBytes(rowKey));

table.delete(deletRow);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值