hbase在java API端的操作

前期

windows配置好jdk(1.8以上)、hadoop的环境变量
已搭建好高可用的集群

API操作

在这里插入图片描述

参照源码:
在这里插入图片描述

准备

/* 日志的笔 */
	protected Logger logger = LogManager.getLogger() ; 
	
	/* 这个对象是玩hbase特别重要的 */
	protected HBaseAdmin hBaseAdmin ;
	//客户端的连接
	protected Connection connection ;
	/* 数据库 */
	private String nameSpace = "java" ; 
	/* 表名 */
	private String tableName = "java:myTest";
	/* 列族 */
	private String cf = "cf" ;
	/**
	 * 初始化的方法
	 */
	@Before
	public void init()
	{
		/* 告诉Hbase,你的Hadoop搁哪了 */
		//本地windows的hadoop的路径
		System.setProperty("hadoop.home.dir", "E:\\帮助文档\\大数据\\hadoop-3.2.1");
		/* 创建一个配置文件对象 */
		Configuration conf = HBaseConfiguration.create(); 
		/* 在hbase里面有一个配置文件hbase-site.xml(忽略)
		 * 这个对应 是hbase-site.xml里面的内容
		 * 键就是property-->name
		 * 值就是property-->value
		 * 您可以一个一个的设置进去
		 * 
		 *  */
		//conf.set(name, value);
		conf.set("hbase.zookeeper.quorum", "node7-1:2181,node7-2:2181,node7-3:2181");
		try
		{
			/* 获取一个Connection对象 */
			connection = ConnectionFactory.createConnection(conf);
			/* 通过connection获取到一个HbaseAdmin */
			hBaseAdmin = (HBaseAdmin) connection.getAdmin() ; 
			this.logger.info("==init==hBaseAdmin:{}",hBaseAdmin);
			
		} catch (IOException e)
		{
			this.logger.error("创建对象时失败了,",e);
		}
	}

关流

/**
	 * 销毁的方法
	 */
	@After
	public void close()
	{
		this.logger.info("==close=={}");
		try
		{
			if(this.hBaseAdmin != null)
			{
				this.hBaseAdmin.close();  
				this.hBaseAdmin = null ; 
			}
		} catch (IOException e)
		{
			this.logger.error("关闭时失败了,",e);
		}
		
		try
		{
			if(this.connection != null)
			{
				this.connection.close();  
				this.connection = null ; 
			}
		} catch (IOException e)
		{
			this.logger.error("关闭时失败了,",e);
		}
//		this.logger.info("==close=={}" , this.connection.isClosed());
	}

测试

	/**
	 * 执行的目标方法
	 */
	@Test
	public void test()
	{
		try
		{
			/* list:列出所有的表的表名 */
			TableName[] tables = this.hBaseAdmin.listTableNames() ; 
			for (int i = 0; i < tables.length; i++)
			{
				TableName tableNameTemp = tables[i];
				this.logger.info("==test==计数:{},名字:{}",i,tableNameTemp);
			}
		} catch (IOException e)
		{
			this.logger.error("测试出错了",e);
		}
	}
}

常用的方法

列举hbase的namespace

@Test
	public void nameSpace_list()
	{
		/* list_namespace */
		try
		{
			//通过hBaseAdmin获取listNamespaceDescriptors
			NamespaceDescriptor[] namespaceDescriptors = this.hBaseAdmin.listNamespaceDescriptors(); 
			//遍历
			for (int i = 0; i < namespaceDescriptors.length; i++)
			{
				NamespaceDescriptor namespaceDescriptor = namespaceDescriptors[i];
				String name = namespaceDescriptor.getName(); 
				this.logger.info("==nameSpace_list==计数:{},名字:{}",i,name);
			}
		} catch (IOException e)
		{
			this.logger.error("报错了",e);
		}
	}

心得:最开始的操作都始于hBaseAdmin,无论是创表,创namespace,在进行这最开始的操作之后,后面的操作基本就是建命,见名知意,在this.hBaseAdmin.listNamespaceDescriptors(),其中括号并无参数,就可接着往下走。

创建hbase的namespace

/**
	 * create_namespace ''
	 */
	@Test
	public void nameSpace_create()
	{
		try
		{
		
			NamespaceDescriptor descriptor = NamespaceDescriptor.create(nameSpace).build();
			/* create_namespace '' */
			this.hBaseAdmin.createNamespace(descriptor);
			this.logger.info("==createNamespace==");
		} catch (IOException e)
		{
			this.logger.error("报错了",e);
		}
	}

心得:this.hBaseAdmin.createNamespace(descriptor);,发现缺少一个(NamespaceDescriptor descriptor),这时需要创建一个NamespaceDescriptor,后面的操作,见名知意

创建表

	/**
	 * table创建 ''
	 * create 'namespace:表名',列族'
	 */
	@Test
	public void table_create()
	{
		try
		{
			/* 表的名字 */
			TableName tableNameObj = TableName.valueOf(tableName);
			/* 表的描述信息 */
			TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableNameObj);
			/* 列族的描述信息 */
			ColumnFamilyDescriptor familyDescriptor = ColumnFamilyDescriptorBuilder.of(cf);
			/* 添加列族;单个列族 */
			builder.setColumnFamily(familyDescriptor);
			/* 获取表的描述信息 */
			TableDescriptor desc = builder.build() ; 
			if(this.hBaseAdmin.tableExists(tableNameObj))
			{
				/* 表存在 */
				/* 禁用表 */
				this.hBaseAdmin.disableTable(tableNameObj);
				/* 删除表 */
				this.hBaseAdmin.deleteTable(tableNameObj);
			}
			/* create_namespace '' */
			this.hBaseAdmin.createTable(desc);
			this.logger.info("==table_create==");
		} catch (IOException e)
		{
			this.logger.error("报错了",e);
		}
	}

心得:1.hBaseAdmin.createTable(desc);,缺少TableDescriptor desc。
2. TableDescriptor desc =TableDescriptorBuilder.newBuilder(tableNameObj).build() ,发现缺少TableName name。
3.TableName tableNameObj = TableName.valueOf(tableName);,发现参数是:TableName name
4.TableName tableNameObj = TableName.valueOf(tableName);
5.builder.setColumnFamily(familyDescriptor);,缺少ColumnFamilyDescriptor family。
6.ColumnFamilyDescriptor familyDescriptor = ColumnFamilyDescriptorBuilder.of(cf);

列举表

/**
	 * 	查看表
	 * list
	 */
	@Test
	public void table_list()
	{
		try
		{
			/* list:列出所有的表 */
			TableName[] tables = this.hBaseAdmin.listTableNames() ; 
			for (int i = 0; i < tables.length; i++)
			{
				TableName tableNameTemp = tables[i];
				this.logger.info("==test==计数:{},名字:{}",i,tableNameTemp);
			}
		} catch (IOException e)
		{
			this.logger.error("测试出错了",e);
		}
	}

在表中添加数据

/**
	 * put '表名','rowKey','列族的属性','值'
	 */
	@Test
	public void table_put()
	{
		try
		{
			/* 表的描述信息 */
			TableName tableNameObj = TableName.valueOf(tableName);
			/* 获取到表对象 */
			Table table = this.connection.getTable(tableNameObj);
			/* 获取表名字 */
			this.logger.info("name:{}",table.getName().getNameAsString());
			
			/* 行键(键) */
			String rowKey = "02" ; 
			/* 插入数据的对象 */
			Put put = new Put(rowKey.getBytes("UTF-8"));
			/* 列族的属性
			 * 参数1:列族
			 * 参数2:属性
			 * 参数3:值
			 *  */
			put.addColumn(this.cf.getBytes("UTF-8"), "name".getBytes("UTF-8"), "lisi".getBytes("UTF-8"));
			put.addColumn(this.cf.getBytes("UTF-8"), "age".getBytes("UTF-8"), "20".getBytes("UTF-8"));
			put.addColumn(this.cf.getBytes("UTF-8"), "createTime".getBytes("UTF-8"), "2019-11-11 11:11:11".getBytes("UTF-8"));
			
			/* 添加数据
			 * 参数如果是Put,那就是单条操作,
			 * 参数如果是List,那就是海量操作(批处理);
			 *  */
			table.put(put);
			this.logger.info("执行完毕");
		} catch (IOException e)
		{
			this.logger.error("测试出错了",e);
		}
	}

获取表中的数据(get)

/**
	 * get '表名','rowKey'
	 */
	@Test
	public void table_get()
	{
		try
		{
			/* 表的描述信息 */
			TableName tableNameObj = TableName.valueOf(tableName);
			/* 获取到表对象 */
			Table table = this.connection.getTable(tableNameObj);
			/* 获取表名字 */
			this.logger.info("name:{}",table.getName().getNameAsString());
			
			/* 行键(键) */
			String rowKey = "02" ; 
			/* 条件,rowKey */
			Get get = new Get(rowKey.getBytes("UTF-8"));
			/* 根据rowKey查询数据
			 *  */
			Result result = table.get(get);
			/* 取单个 */
			byte[] valueByte = result.getValue(cf.getBytes("UTF-8"), "name".getBytes("UTF-8"));
			this.logger.info("根据键,取单个列:{}",new String(valueByte,"UTF-8"));
			
			/* 获取最新的值 */
			Cell lastCell = result.getColumnLatestCell(cf.getBytes("UTF-8"), "name".getBytes("UTF-8"));
			byte[] lastCells = lastCell.getValueArray() ;
			this.logger.info("根据键,取单个列:{}",new String(lastCells,"UTF-8"));
		} catch (IOException e)
		{
			this.logger.error("测试出错了",e);
		}
	}

获取表中的数据(scan)

/**
	 * scan '表名'
	 */
	@Test
	public void table_scan()
	{
		try
		{
			/* 表的描述信息 */
			TableName tableNameObj = TableName.valueOf(tableName);
			/* 获取到表对象 */
			Table table = this.connection.getTable(tableNameObj);
			/* 获取表名字 */
			this.logger.info("name:{}",table.getName().getNameAsString());
			
			/* 获取所有数据 */
			Scan scan = new Scan();
			/* 扫描整张表 */
			ResultScanner resultScan = table.getScanner(scan);
			for (Iterator iterator = resultScan.iterator(); iterator.hasNext();)
			{
				Result result = (Result) iterator.next();
				/* 取单个 */
				byte[] nameByte = result.getValue(cf.getBytes("UTF-8"), "name".getBytes("UTF-8"));
				this.logger.info("根据键,取单个列:{}",new String(nameByte,"UTF-8"));
				
				byte[] ageByte = result.getValue(cf.getBytes("UTF-8"), "age".getBytes("UTF-8"));
				this.logger.info("根据键,取单个列:{}",new String(ageByte,"UTF-8"));
				
				byte[] createTimeByte = result.getValue(cf.getBytes("UTF-8"), "createTime".getBytes("UTF-8"));
				this.logger.info("根据键,取单个列:{}",new String(createTimeByte,"UTF-8"));
			}
		} catch (IOException e)
		{
			this.logger.error("测试出错了",e);
		}
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值