上篇:第6章 HBase API操作(一)
操作步骤:
首先在IDEA工具创建工程项目,如图所示:
构建好的工程的项目,如图所示:
(1)新建项目后在pom.xml文件中,添加依赖:
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
(2)创建包(在java文件目录下创建包study.bigdate.hbase)
并在该包下创建类:TestHbaseAPI_1
在编写代码之前,我们还需要在本身配置好的hbase-1.3.1的conf文件下找到hbase-site.xml文件拷贝到resource文件目录下:
之后,我们在Linux环境下启动hbase的相关的服务:
[root@hadoop105 hbase-1.3.1]# jps
7824 DataNode
7989 SecondaryNameNode
7593 NameNode
7514 QuorumPeerMain
8235 Jps
8156 HMaster
[root@hadoop105 hbase-1.3.1]#
之后,即可在IDEA工具中编写代码:
TestHbaseAPI_1.java
package study.bigdate.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import java.io.IOException;
/**
* 测试 HBase API
*/
public class TestHbaseAPI_1 {
public static void main(String[] args) throws IOException {
//通过java代码访问mysql数据库
//1、加载数据库驱动
//2、获取数据库连接(url、user、password)
//3、获取数据库操作对象
//4、sql
//5、执行数据库操作
//6、获取查询结果ResultSet
//通过java代码访问hbase数据库
//(0) 创建配置对象,获取hbase的连接
Configuration conf= HBaseConfiguration.create();
//(1)获取hbase连接对象
//classLoad--类加载器:Thread.currentThread.getContextClassLoader
//classpath:hbase-default.xml、hbase-site.xml
Connection connection = ConnectionFactory.createConnection(conf);
System.out.println(connection);
//(2)获取操作对象
// (3)操作数据库
//(4) 获取操作结果
//(5)关闭数据库连接
}
}
(1)首先,在Linux环境下进入Hbase客户端,若在进入客户端出现错误,可以参照:
操作Hbase的客户端出现错误
(2)进入Hbase客户端查看数据表有哪些:
hbase(main):023:0> list
TABLE
student
1 row(s) in 0.0320 seconds
=> ["student"]
hbase(main):024:0>
以上,说明HBase的客户端有一张student的数据表
(3)接下来,在IDEA工具编写代码
具体代码实现:
package study.bigdate.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
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 java.io.IOException;
/**
* 测试 HBase API
*/
public class TestHbaseAPI_1 {
public static void main(String[] args) throws IOException {
//通过java代码访问mysql数据库
//1、加载数据库驱动
//2、获取数据库连接(url、user、password)
//3、获取数据库操作对象
//4、sql
//5、执行数据库操作
//6、获取查询结果ResultSet
//通过java代码访问hbase数据库
//(0) 创建配置对象,获取hbase的连接
Configuration conf= HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "hadoop105");
//(1)获取hbase连接对象
//classLoad--类加载器:Thread.currentThread.getContextClassLoader
//classpath:hbase-default.xml、hbase-site.xml
Connection connection = ConnectionFactory.createConnection(conf);
// System.out.println(connection);
//(2)获取操作对象:Admin
//new HBaseAdmin(connection);
Admin admin = connection.getAdmin();
// (3)操作数据库:判断hbase中是否存在某张表
TableName tableName = TableName.valueOf("student1234567");
boolean flg = admin.tableExists(tableName);
System.out.println(flg);
//(4) 获取操作结果
//(5)关闭数据库连接
}
}
启动程序,控制台打印出:
从程序得出,可以判断出是有student的数据表
(1)使用API方式,对HBase数据库对表创建
具体代码实现:
TestHbaseAPI_1.java
package study.bigdate.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import java.io.IOException;
/**
* 测试 HBase API
*/
public class TestHbaseAPI_1 {
public static void main(String[] args) throws IOException {
//通过java代码访问mysql数据库
//1、加载数据库驱动
//2、获取数据库连接(url、user、password)
//3、获取数据库操作对象
//4、sql
//5、执行数据库操作
//6、获取查询结果ResultSet
//通过java代码访问hbase数据库
//(0) 创建配置对象,获取hbase的连接
Configuration conf= HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "hadoop105");
//(1)获取hbase连接对象
//classLoad--类加载器:Thread.currentThread.getContextClassLoader
//classpath:hbase-default.xml、hbase-site.xml
Connection connection = ConnectionFactory.createConnection(conf);
// System.out.println(connection);
//(2)获取操作对象:Admin
//new HBaseAdmin(connection);
Admin admin = connection.getAdmin();
//3) 操作数据库
//3-1)判断命名空间
try {
admin.getNamespaceDescriptor("atguigu");
}catch (NamespaceNotFoundException e){
//创建表空间
NamespaceDescriptor nd=
NamespaceDescriptor.create("atguigu").build();
admin.createNamespace(nd);
}
// (3)操作数据库:判断hbase中是否存在某张表
TableName tableName = TableName.valueOf("atguigu:student");
boolean flg = admin.tableExists(tableName);
System.out.println(flg);
if(flg){
//查询数据
}else{
//创建表描述对象
HTableDescriptor td=new HTableDescriptor(tableName);
//增加列族
HColumnDescriptor cd=new HColumnDescriptor("info");
td.addFamily(cd);
admin.createTable(td);
System.out.println("表创建成功。。。。。");
}
//(4) 获取操作结果
//(5)关闭数据库连接
}
}
启动程序,控制台打印信息:
在Linux环境下,HBase的数据库查看
hbase(main):024:0> list
TABLE
atguigu:student
student
2 row(s) in 0.7600 seconds
=> ["atguigu:student", "student"]
hbase(main):025:0>
查看这张表:
hbase(main):025:0> describe 'atguigu:student'
Table atguigu:student is ENABLED
atguigu:student
COLUMN FAMILIES DESCRIPTION
{NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION =
> 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
1 row(s) in 1.0140 seconds
hbase(main):026:0>
(2)查询数据、查询结果、新增数据、 展现数据
具体代码实现:
package study.bigdate.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
/**
* 测试 HBase API
*/
public class TestHbaseAPI_1 {
public static void main(String[] args) throws IOException {
//通过java代码访问mysql数据库
//1、加载数据库驱动
//2、获取数据库连接(url、user、password)
//3、获取数据库操作对象
//4、sql
//5、执行数据库操作
//6、获取查询结果ResultSet
//通过java代码访问hbase数据库
//(0) 创建配置对象,获取hbase的连接
Configuration conf= HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "hadoop105");
//(1)获取hbase连接对象
//classLoad--类加载器:Thread.currentThread.getContextClassLoader
//classpath:hbase-default.xml、hbase-site.xml
Connection connection = ConnectionFactory.createConnection(conf);
// System.out.println(connection);
//(2)获取操作对象:Admin
//new HBaseAdmin(connection);
Admin admin = connection.getAdmin();
//3) 操作数据库
//3-1)判断命名空间
try {
admin.getNamespaceDescriptor("atguigu");
}catch (NamespaceNotFoundException e){
//创建表空间
NamespaceDescriptor nd=
NamespaceDescriptor.create("atguigu").build();
admin.createNamespace(nd);
}
// (3)操作数据库:判断hbase中是否存在某张表
TableName tableName = TableName.valueOf("atguigu:student");
boolean flg = admin.tableExists(tableName);
System.out.println(flg);
if(flg){
//获取指定的表对象
Table table = connection.getTable(tableName);
//查询数据
//DDL(create drop alter),DML(indate insert,delete),DQL(select)
String rowkey="1001";
Get get=new Get(rowkey.getBytes());
//查询结果
Result result = table.get(get);
boolean empty = result.isEmpty();
System.out.println("1001数据是否存在="+empty);
if(empty){
//新增数据
Put put=new Put(Bytes.toBytes(rowkey));
String famliy="info";
String column="name";
String val="zhangsan";
put.addColumn(Bytes.toBytes(famliy),Bytes.toBytes(column),Bytes.toBytes(val));
table.put(put);
System.out.println("增加数据。。。。。");
}else{
//展现数据
for (Cell cell:result.rawCells()) {
//cell(克隆数据)
//这样写: System.out.println("value="+CellUtil.cloneValue(cell)); 控制台打印出:value=[B@a3d9978
System.out.println("value="+Bytes.toString(CellUtil.cloneValue(cell)));
System.out.println("rowkey="+Bytes.toString(CellUtil.cloneRow(cell)));
System.out.println("family="+Bytes.toString(CellUtil.cloneFamily(cell)));
System.out.println("column="+Bytes.toString(CellUtil.cloneQualifier(cell)));
}
}
}else{
//创建表描述对象
HTableDescriptor td=new HTableDescriptor(tableName);
//增加列族
HColumnDescriptor cd=new HColumnDescriptor("info");
td.addFamily(cd);
admin.createTable(td);
System.out.println("表创建成功。。。。。");
}
//(4) 获取操作结果
//(5)关闭数据库连接
}
}
(3)删除表(通过API操作删除HBase的数据库的表)
具体代码实现:
TestHbaseAPI_2.java
package study.bigdate.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import java.io.IOException;
/**
* 测试 HBase API
*/
public class TestHbaseAPI_2 {
public static void main(String[] args) throws IOException {
Configuration conf= HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "hadoop105");
Connection connection = ConnectionFactory.createConnection(conf);
//删除表
TableName tableName=TableName.valueOf("atguigu:student");
Admin admin=connection.getAdmin();
if(admin.tableExists(tableName)){
//禁用表
admin.disableTable(tableName);
//删除表
admin.deleteTable(tableName);
}
}
}
启动程序,控制台打印信息:
之后,在HBase的客户端的shell操作查看一下:
hbase(main):028:0> list
TABLE
student
1 row(s) in 0.1010 seconds
=> ["student"]
hbase(main):029:0>
说明:atguigu:student数据表成功被删除!
代码具体实现:
package study.bigdate.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
/**
* 测试 HBase API
*/
public class TestHbaseAPI_2 {
public static void main(String[] args) throws IOException {
Configuration conf= HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "hadoop105");
Connection connection = ConnectionFactory.createConnection(conf);
TableName tableName=TableName.valueOf("atguigu:student");
/* Admin admin=connection.getAdmin();
if(admin.tableExists(tableName)){
//禁用表
admin.disableTable(tableName);
//删除表
admin.deleteTable(tableName);
}*/
//删除表
Table table=connection.getTable(tableName);
//delete
String rowkey="1001";
Delete delete=new Delete(Bytes.toBytes(rowkey));
table.delete(delete);
System.out.println("删除数据");
}
}
在Linux环境下,在Hbase的数据表扫描atguigu这张表的数据
hbase(main):002:0> scan 'atguigu:student'
ROW COLUMN+CELL
1001 column=info:sex, timestamp=1579796156497, value=male
1 row(s) in 0.0780 seconds
hbase(main):003:0>
说明:atguigu这张表的数据表是有数据的!
在Linux环境进入HBase的客户端扫描查看atguigu:student的数据是否还在?
hbase(main):004:0> scan 'atguigu:student'
ROW COLUMN+CELL
0 row(s) in 0.0510 seconds
hbase(main):005:0>
说明:数据表的数据不在了,成功被删除