Hbase笔记三之Java操作

这篇博客介绍了如何使用Java操作HBase,主要包括在Pom文件中添加依赖、通过Admin接口操作region以及对Table的操作,特别指出要注意不同HBase版本间的对象使用差异。

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

使用java操作hbase的几个简单的例子,hbase版本是1.1.8,注意0.98和1.xx版本在使用对象上的区别

Pom文件

访问maven网站http://mvnrepository.com,输入hbase搜索选择对应版本

<dependency>

           <groupId>org.apache.hbase</groupId>

           <artifactId>hbase-client</artifactId>

           <version>1.1.8</version>

       </dependency>


Admin接口

package hbase;

import java.io.IOException;

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.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;

/**
 * //admin是一个接口,通过getAdmin获得并需要关闭,它可以用来执行创建删除表,添加删除列族等操作
 * 在0.98中使用HBaseAdmin;在1.xx之后的版本,统一使用Admin
 * @author think
 *
 */
public class HbaseAdminExample {

	public static void main(String[] args) throws IOException {
		//1.获取hadoop的Configuration对象
		Configuration conf = HBaseConfiguration.create();
		
		//2.获取Connection对象通过ConnectionFacorty
		//  在1.X版本中需要手动获取Connection并手动关闭
		Connection connect = ConnectionFactory.createConnection(conf);
		
		//3.获取Admin,
		Admin admin = connect.getAdmin();
		
		//4.create
		//在1.xx版本表名称只能使用TableName
		//构造tableName
		TableName name = TableName.valueOf("tx3");//默认命名空间default
		HTableDescriptor desc = new HTableDescriptor(name);
		//构造列族
		HColumnDescriptor family = new HColumnDescriptor("f1");
		desc.addFamily(family);
		admin.createTable(desc);
		
		TableName[] listTableNames = admin.listTableNames();
		System.out.println(listTableNames.length);
		admin.close();
		
		//关闭connect
		if(null != connect)
		{
			connect.close();
		}
	}

}

操作region

我只拿到对象后期补充

package hbase;

import java.io.IOException;
import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HRegionLocation;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.RegionLocator;

/**
 * 0.98版本使用table.getRegionLocations()获取region信息;
 * 1.xx通过单独的regionlocator类回去region信息
 * @author think
 *connection.getConfiguration()
 *connection.getBufferedMutator(tableName)  缓冲
 */
public class RegionOperation {

	public static void main(String[] args) throws IOException {
		//获取RegionLocator
		Configuration conf = HBaseConfiguration.create();
		Connection connection = ConnectionFactory.createConnection(conf);
		RegionLocator regionLocator = connection.getRegionLocator(TableName.valueOf("t1"));
		List<HRegionLocation> allRegionLocations = regionLocator.getAllRegionLocations();
		for(HRegionLocation region : allRegionLocations)
		{
			System.out.println(region);//region信息
		}
		
		regionLocator.close();
		connection.close();
	}

}


操作Table
package hbase;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.NavigableMap;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
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.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;


/**
 * 在0.98版本使用HTable,1.xx中使用Table对象操作表
 * 使用Table对象可以对表执行get, put, delete or scan操作,只能作用一张表
 * 注意:每次操作table时客户端会与region server建立rpc通讯会消耗时间,所以尽量采用批量方式
 * @author think
 *
 */
public class TableOperation {

	public static void main(String[] args) throws IOException {
		//获取Table
		Connection connection = ConnectionFactory.createConnection(HBaseConfiguration.create());
		TableName tableName = TableName.valueOf("tx1");
		Table table = connection.getTable(tableName);
		//put
		putData(connection, table);
		
		//batchPut
		batchPut(table, 30000);
		
		//get
		getData(table);
		
		//scan
		scan(table);
		
		//count
		count(table);
		
		table.close();
		connection.close();
	}

	/**
	 * 批量,客户端和hbase只建立一次rpc通讯所以效率较高
	 * @param table
	 * @param max
	 * @throws IOException
	 */
	private static void batchPut(Table table, int max) throws IOException {
		List<Put> list = new ArrayList<Put>(max);
		for(int i = 0; i < max; i++)
		{
			byte[] rowKey = Bytes.toBytes(i);
			Put put = new Put(rowKey);
			
			byte[] family = Bytes.toBytes("f1");
			byte[] qualifier = Bytes.toBytes("c1");
			long ts = 1l;
			byte[] value = Bytes.toBytes(200 + i);
			put.addColumn(family, qualifier, ts, value);
			list.add(put);
		}
		table.put(list);
	}

	private static void count(Table table) throws IOException {
		Scan scan = new Scan();
		ResultScanner scanner = table.getScanner(scan);
		int i = 0;
		for(Result result : scanner)
		{
			i++;
		}
		System.out.println("count:" + i);
	}

	private static void scan(Table table) throws IOException {
		Scan scan  = new Scan(); 
		ResultScanner scanner = table.getScanner(scan);
		for(Result result : scanner)
		{
			printResult(result);
		}
	}

	private static void getData(Table table) throws IOException {
		Get get = new Get(Bytes.toBytes("r1"));//行健
		get.addFamily(Bytes.toBytes("f1"));//列族
		Result result = table.get(get);
		System.out.println(result);
		printResult(result);
		
		Get g = new Get(Bytes.toBytes("r1"));//行健
		g.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("c1"));//列族+列限定符
		Result result2 = table.get(g);
		printResult(result2);
	}

	private static void putData(Connection connection, Table table) throws IOException {
		//put 'tx1','r1','f1:c1',1,200
		byte[] rowKey = Bytes.toBytes("r1");
		byte[] family = Bytes.toBytes("f1");
		byte[] qualifier = Bytes.toBytes("c1");
		long ts = 1l;
		byte[] value = Bytes.toBytes(200);
		Put put = new Put(rowKey); 
		put.addColumn(family, qualifier, ts, value);
		table.put(put);
	}

	private static void printResult(Result result) {
		if(null != result)
		{
			byte[] rowKey = result.getRow();
			//map<family列族,map<列限定符,map<版本,value>>>
			NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
			for(Map.Entry<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> entry1 : map.entrySet())
			{
				byte[] fkey = entry1.getKey();//列族
				NavigableMap<byte[], NavigableMap<Long, byte[]>> map1 = entry1.getValue();
				//map<列限定符,map<版本,value>>
				for(Map.Entry<byte[], NavigableMap<Long, byte[]>> entry2 : map1.entrySet())
				{
					byte[] ckey = entry2.getKey();//列限定符
					NavigableMap<Long, byte[]> map2 = entry2.getValue();
					for(Map.Entry<Long, byte[]> entry3 : map2.entrySet())
					{
						long ts = entry3.getKey();
						byte[] value = entry3.getValue();
						System.out.println("行健:" + Bytes.toString(rowKey) + " 列族:列限定符:"+ Bytes.toString(fkey) + ":" + Bytes.toString(ckey) + " 版本:" + ts + " value:" + Bytes.toString(value));
					}
				}
			}
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值