eclipse实现 hbase api(一)

本文详细介绍如何使用 Java API 操作 HBase,包括环境搭建、依赖配置及 CRUD 示例。通过实战演示表的创建、数据的增删查改等功能。

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

1,环境准备

如果对hbase还不了解可以看一下博客:

hbase介绍:     https://blog.youkuaiyun.com/weixin_41122339/article/details/81901041

hbase基本命令:   https://blog.youkuaiyun.com/weixin_41122339/article/details/81905065

1,jdk 1.8

2,   hbase 1.2.6

3,   maven+eclipse

4,   如果不想使用maven可在hbase的安装目录下的lib目录把所有jar包考到eclipse下

5,直接创建项目mvaven项目和普通项目看你们了

2,maven的pom文件(不使用maven略过)

  <dependencies>
  <dependency>
			<groupId>org.apache.hbase</groupId>
			<artifactId>hbase-client</artifactId>
			<version>1.2.6</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hbase</groupId>
			<artifactId>hbase-server</artifactId>
			<version>1.2.6</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.9</version>
		</dependency>
  </dependencies>

3,下面就是hbase  一些简单的api操作 

首先说一下我想要下面运行成功,还需要配置一个hbase-site.xml文件,因为大家往下看会发现没有配置连接的端口号等一下配置信息,因为我把这些配置都配置到了hbase-site.xml文件中,这个文件其实就是咱们habse安装目录下的conf目录下的hbase-site.xml文件,如果和我配置的一样那么直接copy一下就行了,大家会问了为什么配置这个文件,api会识别这个文件吗,答案当然是可以的了,他源码中会自动加载一个default.xml和hbase-site.xml这两个文件默认配置咱们就不说了,hbase-site.xml这个文件直接copy到eclipse的src下,信息如下:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  <!--绑定hbase在hdfs上的存储位置-->
<property>
	<name>hbase.rootdir</name>
	<value>hdfs://t124:8020/user/hbase</value>
</property>
  <!--启用分布式集群-->
<property>
	<name>hbase.cluster.distributed</name>
	<value>true</value>
</property>
  <!--配置独立的ZK集群地址-->
<property>
	<name>hbase.zookeeper.quorum</name>
	<value>t125:2181,t126:2181,t127:2181</value>
</property>
</configuration>

代码块:

package myhbasedemo;

import java.util.Iterator;
import java.util.Map.Entry;
import java.util.NavigableMap;
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.NamespaceDescriptor;
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.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;
import org.junit.Test;

public class myhbaseTest {
	/**
	 * 创建名字空间
	 * 
	 * @throws Exception
	 */
	@Test
	public void createNS() throws Exception {
		// 创建hbase配置对象他返回的hadoop的配置对象
		Configuration conf = HBaseConfiguration.create();
		// 通过连接工厂创建连接对象加载配置
		Connection conn = ConnectionFactory.createConnection(conf);
		// 得到管理程序
		Admin admin = conn.getAdmin();
		// 创建名字空间使用createnamespace方法他构造需要传入一个namespaceDescriptor对象
		// namespaceDescriptor对象需要使用namespaceDescriptor类名调用他的抽象方法create获取一个build对象构造里填入名字空间的名字
		// build对象调用他的build方法返回namespaceDescriptor对象
		admin.createNamespace(NamespaceDescriptor.create("zxz1").build());

	}

	/**
	 * 创建表和列族
	 * 
	 * @throws Exception
	 * 
	 */
	@Test
	public void createtable() throws Exception {
		// 创建hbase配置对象他返回的hadoop的配置对象
		Configuration conf = HBaseConfiguration.create();
		// 通过连接工厂创建连接对象加载配置
		Connection conn = ConnectionFactory.createConnection(conf);
		// 得到管理程序
		Admin admin = conn.getAdmin();
		// 创建表之前要创建一个tablename对象默认在在默认空间创建表
		// TableName.valueOf("zxz_table")
		// 这种是指定在zxz1名字空间创建
		TableName tab = TableName.valueOf("zxz1", "zxz_table");
		// 创建表还需要创建表描述对象创建,构造要添加tablename对象
		HTableDescriptor htd = new HTableDescriptor(tab);
		// 添加列族,每个表至少要有一个列族使用addFamily方法添加列族,构造需要指定一个列族描述对象指定一个叫z1的列族
		htd.addFamily(new HColumnDescriptor("z1"));
		// admin.createTable(new HTableDescriptor());
		// 使用createtable创建表,构造添加一个表描述对象上面已经定义好了
		admin.createTable(htd);
	}

	/**
	 * 插入数据
	 * 
	 * @throws Exception
	 */
	@Test
	public void putdata() throws Exception {
		// 创建hbase配置对象他返回的hadoop的配置对象
		Configuration conf = HBaseConfiguration.create();
		// 通过连接工厂创建连接对象加载配置
		Connection conn = ConnectionFactory.createConnection(conf);
		// 因为是ddl语言所以用不到管理对象
		// 获得table对象使用gettable方法,构造需要一个tablename对象需要指定名字空间和表名
		Table tab = conn.getTable(TableName.valueOf("zxz1", "zxz_table"));
		// 创建put对象他构造需要传入一个字节数组的rowkey,我们可以使用hbase封装好的Bytes对象的tobytes方法来指定rowkey
		Put put = new Put(Bytes.toBytes("zrow1"));
		// 添加数据调用addcolumn方法,构造需要传入列族,列,值这三个值,都需要是byte[]类型的
		put.addColumn(Bytes.toBytes("z1"), Bytes.toBytes("name"), Bytes.toBytes("tom"));
		put.addColumn(Bytes.toBytes("z1"), Bytes.toBytes("age"), Bytes.toBytes(12));
		put.addColumn(Bytes.toBytes("z1"), Bytes.toBytes("sex"), Bytes.toBytes("男"));
		// 使用table对象的put方法构造是刚才定义的put对象
		tab.put(put);
		// 关流
		tab.close();
	}

	/**
	 * 删除数据
	 * 
	 * @throws Exception
	 */
	@Test
	public void deletedata() throws Exception {
		// 创建hbase配置对象他返回的hadoop的配置对象
		Configuration conf = HBaseConfiguration.create();
		// 通过连接工厂创建连接对象加载配置
		Connection conn = ConnectionFactory.createConnection(conf);
		// 因为是ddl语言所以用不到管理对象
		// 获得table对象使用gettable方法,构造需要一个tablename对象需要指定名字空间和表名
		Table tab = conn.getTable(TableName.valueOf("zxz1", "zxz_table"));
		// 创建delete对象指定rowkey
		Delete del = new Delete(Bytes.toBytes("zrow1"));
		// 如果是删除某个rowkey的值只需要指定列族和列就行了我们这里删除一条就好了
		del.addColumn(Bytes.toBytes("z1"), Bytes.toBytes("sex"));
		// 删除delete对象指定的数据
		tab.delete(del);
		tab.close();
	}

	/**
	 * 扫描数据
	 * 
	 * @throws Exception
	 */
	@Test
	public void scandata() throws Exception {
		// 创建hbase配置对象他返回的hadoop的配置对象
		Configuration conf = HBaseConfiguration.create();
		// 通过连接工厂创建连接对象加载配置
		Connection conn = ConnectionFactory.createConnection(conf);
		// 因为是ddl语言所以用不到管理对象
		// 获得table对象使用gettable方法,构造需要一个tablename对象需要指定名字空间和表名
		Table tab = conn.getTable(TableName.valueOf("zxz1", "zxz_table"));
		// 创建scan对象
		Scan scan = new Scan();
		// 得到扫描器对象,利用table对象的getscanner方法构造把scan对象传进去
		ResultScanner scanner = tab.getScanner(scan);
		// 我们通过迭代器遍历这个结果集扫描器对象返回一个迭代器
		Iterator<Result> iterator = scanner.iterator();
		// 使用while虚幻遍历迭代器对象
		while (iterator.hasNext()) {
			// 返回hbase的结果集对象
			Result rs = iterator.next();
			// 调用getfamilymap()方法指定一个byte数组类型的列族,返回一个可导航的map,他会得到顺序的值
			NavigableMap<byte[], byte[]> nm = rs.getFamilyMap(Bytes.toBytes("z1"));
			// 遍历map对象得到所有的列和值
			for (Entry<byte[], byte[]> result : nm.entrySet()) {
				// 遍历列,因为都是字符串所以转为字符串
				String key = Bytes.toString(result.getKey());
				// 先遍历出来等判断后转为自己本身的类型
				byte[] value = result.getValue();
				// 我这里只有age列的值是int类型所以判断一下
				if (key.equals("age")) {

					System.out.println(key + "  " + (Bytes.toInt(value)));
				}
				System.out.println(key + "  " + Bytes.toString(value));
			}

		}
		tab.close();
	}
}

后续还有!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值