HBase javaAPI(二):实现对表简单的增删查改

本文介绍如何使用 Java API 在 HBase 上执行表的创建、删除,以及数据的插入、删除和查询操作。通过具体示例展示了连接配置、表结构设计、数据增删查改等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面讲个JavaAPI几个主要类的使用方法

这次使用JavaAPI实现在hbase上 新建、删除表,以及在表里面插入、删除、查询数据,里面有注释

package Demo;

import java.io.IOException;
import java.util.ArrayList;
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.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
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.Row;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;

//import org.apache.hadoop.hbase.ipc.RpcServer.Connection;

public class HBaseAPI {
	static final String tablename="test";//设置表名
	static final String FAMILY1="info";//列簇名1
	static final String FAMILY2="scors";//列簇名2
	static final String ROWKEY1="rk-100";//行号1
	static final String ROWKEY2="rk-200";//行号2
	static final String COL1="name";//列名1
	static final String COL2="age";//列名2
	
	public static void main(String[] args) throws IOException, InterruptedException{
		
		//hbase连接配置
		Configuration conf = HBaseConfiguration.create();
		conf.set("hbase.master", "master:16000");//指定hmaster
		conf.set("hbase.rootdir", "hdfs://master:8020/hbase");//hbase在hdfs上的存储地址
		conf.set("hbase.zookeeper.quorum", "slave1,slave2,slave3");//指定使用的zookeeper集群
		conf.set("hbase.zookeeper.property.clientPort", "2181");//指定zookeeper集群端口
		
		Connection conn = ConnectionFactory.createConnection(conf);//获取连接
		
		//调用函数进行增删查改
		createTable(conn);
		putData(conn);
		getData(conn);
		scanData(conn);
		alterFamily(conn);
		batchData(conn);
	}
	
	//创建或删除表
	public static void createTable(Connection conn) throws IOException{
		Admin admin=conn.getAdmin();
		TableName tableName=TableName.valueOf(tablename);
		//设计表结构
		HTableDescriptor ht=new HTableDescriptor(tableName);//创建表
		ht.addFamily(new HColumnDescriptor(FAMILY1));//创建列簇1
		ht.addFamily(new HColumnDescriptor("FAMILY2").setMaxVersions(10));//创建列簇2并设置版本为10
		byte[][] regions=new byte[][]{   //设置region分割区间
			Bytes.toBytes("10"),
			Bytes.toBytes("50"),
			Bytes.toBytes("90"),			
		};
		
		if(!admin.tableExists(tableName)){  //判断表是否存在
			admin.createTable(ht,regions);
		}
		else{
			if(!admin.isTableDisabled(tableName)){   //判断表是否有为disable状态
				admin.disableTable(tableName);
			}
			admin.deleteTable(tableName);
			System.out.println(tablename+"表已删除");
			admin.createTable(ht,regions);
			
		}
		System.out.println(tablename+"表已创建");
	}
	
	//插入数据到表中
	public static void putData(Connection conn) throws IOException{
		//建立表连接
		Table table=conn.getTable(TableName.valueOf(tablename));
		
		Put put =new Put(ROWKEY1.getBytes());
		put.addColumn(FAMILY1.getBytes(), COL1.getBytes(), "zhansan".getBytes());
		put.addColumn(FAMILY1.getBytes(), COL2.getBytes(), "20".getBytes());
		table.put(put);
		
		put =new Put(ROWKEY2.getBytes());
		put.addColumn(FAMILY1.getBytes(), COL1.getBytes(), "lisi".getBytes());
		put.addColumn(FAMILY1.getBytes(), COL2.getBytes(), "25".getBytes());
		table.put(put);
		
		System.out.println("插入数据成功");
	}
	
	//读取数据
	public static void getData(Connection conn) throws IOException{
		//建立表连接
		Table table=conn.getTable(TableName.valueOf(tablename));
		
		Get get=new Get(ROWKEY1.getBytes());//读取ROWKEY1行的数据
		get.addFamily(FAMILY1.getBytes());//读取FAMILY1簇的数据
		Result result= table.get(get);
		
//		System.out.println(new String(result.getValue(FAMILY1.getBytes(), COL1.getBytes())));
		for(Cell cell:result.rawCells()){
			System.out.print(new String(CellUtil.cloneRow(cell))+'\t');
			System.out.print(new String(CellUtil.cloneFamily(cell))+':');
			System.out.print(new String(CellUtil.cloneQualifier(cell))+' ');
			System.out.print(new String(CellUtil.cloneValue(cell)));
			System.out.println();
		}
//		System.out.println(new String(result.value()));
		
	}
	
	//scan获取数据
	public static void scanData(Connection conn) throws IOException{
		//建立表连接
		Table table=conn.getTable(TableName.valueOf(tablename));
		
//		Scan scan=new Scan(ROWKEY2.getBytes());//查看rowkey为ROWKEY2的数据,如果查询全部则去掉ROWKEY2.getBytes()
		Scan scan=new Scan();
		//设置rowkey区间,区间为左闭右开
		scan.setStartRow("rk-100".getBytes());
		scan.setStopRow("rk-300".getBytes());
		
		ResultScanner scanner = table.getScanner(scan);
		Iterator<Result> results = scanner.iterator();
		while(results.hasNext()){
			Result result=results.next();
			for(Cell cell:result.rawCells()){
				System.out.print(new String(CellUtil.cloneRow(cell))+'\t');
				System.out.print(new String(CellUtil.cloneFamily(cell))+':');
				System.out.print(new String(CellUtil.cloneQualifier(cell))+' ');
				System.out.print(new String(CellUtil.cloneValue(cell)));
				System.out.println();
			}
		}
	}
	
	//修改列簇
	public static void alterFamily(Connection conn) throws IOException{
		Admin admin = conn.getAdmin();
		TableName tableName = TableName.valueOf(tablename);
		if(admin.tableExists(tableName)){
//			admin.disableTable(tableName);
			HTableDescriptor hTableDescriptor = admin.getTableDescriptor(TableName.valueOf(tablename));
			hTableDescriptor.removeFamily("info".getBytes());//删除info列簇
			System.out.println("列簇以删除");
			hTableDescriptor.addFamily(new HColumnDescriptor("info1"));//新增info1列簇
			System.out.println("列簇已添加");
			admin.modifyTable(tableName, hTableDescriptor);
			admin.enableTable(tableName);
//			admin.close();
			
		}
		
	}
	
	//将创建表,插入数据,删除数据、查看数据整合一起远行
	public static void batchData(Connection conn) throws IOException, InterruptedException{
	    Table table = conn.getTable(TableName.valueOf(tablename));
	  
	    List<Row> batch = new ArrayList<Row>();
	  
	    Put put = new Put(ROWKEY1.getBytes());//插入ROWKEY1簇数据
	    put.addColumn("scors".getBytes(), "courseid".getBytes(),"c001".getBytes());//参数:列簇,列名,值
	    put.addColumn("info".getBytes(), "courseid".getBytes(),"c001".getBytes());
	    batch.add(put);
	    
	    put = new Put(ROWKEY2.getBytes());
	    put.addColumn("scors".getBytes(), "courseid".getBytes(),"c001".getBytes());
	    put.addColumn("info".getBytes(), "courseid".getBytes(),"c001".getBytes());
	    batch.add(put);
	  
	    Delete delete = new Delete(ROWKEY2.getBytes());
	  	delete.addFamily("info".getBytes());//删除rk-200里面的“info”簇数据
	  	batch.add(delete);
	  
	  	Get get = new Get(ROWKEY1.getBytes());
	  	get.getMaxVersions();
	  	batch.add(get);
	  	Object[] results = new Object[batch.size()];
	  	table.batch(batch,results);
	  	Result result = (Result) results[3];
	  	for(Cell cell:result.rawCells()){		
	  		System.out.println(new String(CellUtil.cloneRow(cell)));
		   	System.out.println(new String(CellUtil.cloneFamily(cell)));
		   	System.out.println(new String(CellUtil.cloneQualifier(cell)));
		   	System.out.println(new String(CellUtil.cloneValue(cell)));
		   	System.out.println();
		  }
	 }
	
}

 

创建表结果

插入数据结构

读取数据结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值