一、HBase数据模型
HBase分布式数据库的数据存储在行列式的表格中,它是一个多维度的映射模型,其数据模型如下所示。表的索引是行键,列族,列限定符和时间戳,表在水平方向由一个或者多个列族组成,一个列族中可以包含任意多个列,列族支持动态扩展,可以很轻松的添加一个列族或者列,无须预先定义列的数量及数据类型,所有列均以字符串形式存储
RowKey表示行键,每个HBase表中只能有一个行键,它在HBase中以字典序的方式存储。由于RowKey是HBase表的唯一标识,因此Row Key的设计非常重要。
HBase表的列是由列族名、限定符以及列名组成的,其中“:”为限定符。创建HBase表不需要指定列,因为列是可变的,非常灵活。
在HBase中,列族由很多列组成。在同一个表里,不同列族有完全不同的属性,但是同一个列族内的所有列都会有相同的属性,而属性都是定义在列族上的。
表示时间戳,记录每次操作数据的时间,通常记作数据的版本号。
二、HBase的Shell操作
HBase Shell提供大量操作HBase的命令,通过Shell命令很方便地操作HBase数据库,如创建、删除及修改表、向表中添加数据、列出表中的相关信息等操作。当使用Shell命令行操作HBase时,需要进入HBase Shell交互界面,执行“bin/hbase shell”命令进入到目录/hbase的界面。
在HBase Shell交互界面中,可通过一系列Shell命令操作HBase,下面通过一张表列举操作HBase表常见的Shell命令。
1)显示hbase中的表l ist
2)创建表user,包含info、data两个列族
3)向user表中插入数据
4)获取user表中row key为rk0001的所有信息
5)获取user表中row key为rk0001,列族为info,版本号最新3个的信息 HBase2.0默认VERSIONS为1,也就是说,默认情况只会存取一个版本的列数据。需要使用alter命令修改表的版本号。
清空表数据
添加列族
三、HBase的Java API操作
HBase是由Java语言开发的,它对外提供了Java API的接口。下面,通过一个表来列举HBase常见的Java API。
下面代码主要利用HBase常用的Java API进行表的创建,插入,删除等操作
package com.hadoop.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 org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class HbaseApiDemo {
//初始化Configuration对象
private Configuration conf = null;
//初始化连接
private Connection conn = null;
@Before
public void init() throws Exception {
//获取Configuration对象
conf = HBaseConfiguration.create();
//对于hbase的客户端来说,只需要知道hbase所经过的Zookeeper集群地址即可
conf.set("hbase.zookeeper.quorum", "bigdata01:2181,bigdata02:2181,bigdata03:2181");
//获取连接
conn = ConnectionFactory.createConnection(conf);
}
@Test
public void CreateTable() throws Exception {
try {
//获取操作对象
Admin admin = conn.getAdmin();
//构建一个user表
TableDescriptorBuilder t_user = TableDescriptorBuilder.newBuilder(TableName.valueOf("t_user"));
//创建列族 1
ColumnFamilyDescriptor of = ColumnFamilyDescriptorBuilder.of("info");
t_user.setColumnFamily(of);
//创建列族 2
ColumnFamilyDescriptor of1 = ColumnFamilyDescriptorBuilder.of("data");
t_user.setColumnFamily(of1);
//构建
TableDescriptor build = t_user.build();
//创建表
admin.createTable(build);
// 关闭连接
admin.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testPut() throws Exception {
//创建table对象,通过table对象来添加数据
Table table = conn.getTable(TableName.valueOf("t_user"));
//创建一个集合,用于存放Put对象
ArrayList<Put> puts = new ArrayList<Put>();
//构建put对象(kv形式),并指定其行键
Put put01 = new Put(Bytes.toBytes("rk002"));
put01.addColumn(Bytes.toBytes("info"),
Bytes.toBytes("username"), Bytes.toBytes("zhangsan"));
put01.addColumn(Bytes.toBytes("info"),
Bytes.toBytes("password"), Bytes.toBytes("345678"));
Put put02 = new Put("rk003".getBytes());
put02.addColumn(Bytes.toBytes("info"),
Bytes.toBytes("username"), Bytes.toBytes("lisi"));
//把所有的put对象添加到一个集合中
puts.add(put01);
puts.add(put02);
//提交所有的插入数据的记录
table.put(puts);
//关闭
table.close();
conn.close();
}
@Test
public void testGet() throws IOException {
Table table = conn.getTable(TableName.valueOf("t_user"));
//得到用于扫描region的对象
// Scan scan = new Scan();
Get get = new Get("rk002".getBytes());
//使用HTable得到resultcanner实现类的对象
Result result1 = table.get(get);
List<Cell> cells = result1.listCells();
for (Cell cell : cells) {
//得到rowkey
System.out.println("行键:" + Bytes.toString(CellUtil.cloneRow(cell)));
//得到列族
System.out.println("列族:" + Bytes.toString(CellUtil.cloneFamily(cell)));
System.out.println("列:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
System.out.println("值:" + Bytes.toString(CellUtil.cloneValue(cell)));
}
}
@Test
public void testScan() throws Exception {
//获取table对象
Table table = conn.getTable(TableName.valueOf("t_user"));
//获取scan对象
Scan scan = new Scan();
//获取查询的数据
ResultScanner scanner = table.getScanner(scan);
//获取ResultScanner所有数据,返回迭代器
Iterator<Result> iter = scanner.iterator();
//遍历迭代器
while (iter.hasNext()) {
//获取当前每一行结果数据
Result result = iter.next();
//获取当前每一行中所有的cell对象
List<Cell> cells = result.listCells();
//迭代所有的cell
for(Cell c:cells){
//获取行键
byte[] rowArray = c.getRowArray();
//获取列族
byte[] familyArray = c.getFamilyArray();
//获取列族下的列名称
byte[] qualifierArray = c.getQualifierArray();
//列字段的值
byte[] valueArray = c.getValueArray();
//打印rowArray、familyArray、qualifierArray、valueArray
System.out.println("行键:"+new String(rowArray, c.getRowOffset(),
c.getRowLength()));
System.out.print("列族:"+new String(familyArray,c.getFamilyOffset(),
c.getFamilyLength()));
System.out.print(" "+"列:"+ new String(qualifierArray,
c.getQualifierOffset(), c.getQualifierLength()));
System.out.println(" "+"值:"+ new String(valueArray,
c.getValueOffset(), c.getValueLength()));
}
System.out.println("-----------------------");
}
//关闭
table.close();
conn.close();
}
@Test
public void testDel() throws Exception {
//获取table对象
Table table = conn.getTable(TableName.valueOf("t_user"));
//获取delete对象,需要一个rowkey
Delete delete = new Delete("rk002".getBytes());
//在delete对象中指定要删除的列族-列名称
delete.addColumn("info".getBytes(), "password".getBytes());
//执行删除操作
table.delete(delete);
//关闭
table.close();
conn.close();
}
@Test
public void testDrop() throws Exception {
//获取一个表的管理器
Admin admin = conn.getAdmin();
//删除表时先需要禁用表
admin.disableTable(TableName.valueOf("t_user"));
admin.deleteTable(TableName.valueOf("t_user"));
//关闭
admin.close();
conn.close();
}
}
创作不易 觉得有帮助请点赞关注收藏~~~