环境统一:
zk:
hadoop:2.7.5
HBase:2.0.0
ssh软件:Bitvise
1.Hbase简介
hbase依赖于hdfs,非关系型数据库
是一种稀疏表结构(稀疏表就是空行并不占用磁盘空间)
hbase当中所有数据都是byte[]类型
(1)Hbase的数据存储架构
- 主节点:HMster
- 监控regionServer健康状态
- 处理regionServer故障转移
- 处理元数据变更
- 处理region的分配或者移除
- 空闲时间做负载均衡
- 从节点:HRegionServer
- 负责存储HBase的实际数据
- 处理分配给他的region
- 刷新缓存的数据到HDFS上去
- 维护HLog
- 执行数据的压缩
- 负责处理region分片
一个HRegionServer = 1个HLog+很多个region
1个region=很多个store模块组成
1个store模块 = 1个memoryStore+很多storeFile
(2)HLog模块的使用场景
HLog是为了解决数据丢失问题,HBase在读写时,不是直接存储磁盘,中间会有停留内存的一个时间段,在内存中可能发生断电丢失等等数据丢失问题,所以设置一个HLog模块,将数据写入文件中,在通过文件写入内存,在通过内存写入磁盘.当内存到磁盘过程出现问题导致数据丢失时,可以使用HLog文件对数据重建.
2.HBase集群搭建
注意事项:HBase是依赖于HDFS的所以在安装前一定要保证hadoop和zk启动
(1)下载上传解压
通过ssh上传至node01节点下/export/software
//解压
tar -zxvf hbase-2.0.0-bin.tar.gz -C /export/servers/
(2)修改配置文件
使用Notepad++连接node01节点进行配置文件修改
1.hbase-env.sh
export JAVA_HOME=/export/servers/jdk1.8.0_141
export HBASE_MANAGES_ZK=false
2.hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://node01:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 0.98后的新变动,之前版本没有.port,默认端口为60000 -->
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/export/servers/zookeeper-3.4.9/zkdatas</value>
</property>
</configuration>
3.regionservers
node01
node02
node03
4.创建back-masters配置文件,实现HMaster的高可用
cd /export/servers/hbase-2.0.0/conf
vim backup-masters
node02
5.安装包分发到其他机器
cd /export/servers/
scp -r hbase-2.0.0/ node02:$PWD
scp -r hbase-2.0.0/ node03:$PWD
6.三台机器创建软连接
因为hbase需要读取hadoop的core-site.xml以及hdfs-site.xml当中的配置文件信息,所以我们三台机器都要执行以下命令创建软连接
ln -s /export/servers/hadoop-2.7.5/etc/hadoop/core-site.xml /export/servers/hbase-2.0.0/conf/core-site.xml
ln -s /export/servers/hadoop-2.7.5/etc/hadoop/hdfs-site.xml /export/servers/hbase-2.0.0/conf/hdfs-site.xml
7.三台机器添加HBASE_HOME的环境变量
vim /etc/profile
export HBASE_HOME=/export/servers/hbase-2.0.0
export PATH=:$HBASE_HOME/bin:$PATH
8.HBase集群启动
cd /export/servers/hbase-2.0.0
bin/start-hbase.sh
9.页面访问
浏览器页面访问地址:
http://node01:16010/master-status
3.Hbase表模型
rowKey:行键.每一行数据都是使用行键进行标识的
columnFamily:列族,列族下面可以有多列
column:列的概念,每一个列都必须归属于某一个列族
timestamp:时间戳,每条数据都会有时间戳的概念
versionNum:版本号,每条数据都会有版本号,每次数据变化,版本号都会进行更新
创建一张HBase表最少需要两个条件:表名+列族名
注意:rowkey是我们在插入数据的时候自己指定的,列名 也是在我们插入数据的时候动态指定的,时间戳是插入数据的时候,系统自动帮我们生成的,versionNum是系统自动维护的
4.HBase的Shell客户端操作
(1)进入HBase客户端命令操作界面
cd /export/servers/hbase-2.0.0
bin/hbase shell
(2)查看当前数据库中有哪些表
list
(3)创建一张表
创建user表,包含info、data两个列族
create 'user', 'info', 'data'
(4)向表中添加数据
向user表中插入信息,row key为rk0001,列族info中添加name列标示符,值为zhangsan
put 'user', 'rk0001', 'info:name', 'zhangsan'
(5)查看表中数据
scan "user"
(6)数据查询
1.通过rowkey进行查询
- 获取user表中row key为rk0001的所有信息
get 'user', 'rk0001'
2.查看rowkey下面的某个列族的信息
- 获取user表中row key为rk0001,info列族的所有信息
get 'user', 'rk0001', 'info'
3.查看rowkey指定列族指定字段的值
- 获取user表中row key为rk0001,info列族的name、age列标示符的信息
get 'user', 'rk0001', 'info:name', 'info:age'
4.查看rowkey指定多个列族的信息
get 'user', 'rk0001', 'info', 'data'
5.指定rowkey与列值查询
get 'user', 'rk0001', {FILTER => "ValueFilter(=, 'binary:zhangsan')"} //ValueFilter值过滤器,过滤出二进制(binary)结果值等于的张三
6.指定rowkey与列值模糊查询
获取user表中row key为rk0001,列标示符中含有a的信息
get 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"} //QualifierFilter列过滤器,过滤出列名包含a的
7.查询所有数据
查询user表中的所有信息
scan 'user'
8.列族查询
查询user表中列族为info的信息
scan 'user', {COLUMNS => 'info'}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 3}
9.多列族查询
查询user表中列族为info和data的信息
scan 'user', {COLUMNS => ['info', 'data']}
scan 'user', {COLUMNS => ['info:name', 'data:pic']}
10.指定列族与某个列名查询
查询user表中列族为info、列标示符为name的信息
scan 'user', {COLUMNS => 'info:name'}
15.指定范围值查询
查询user表中指定范围的数据
scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}
(7)更新数据操作
1.更新数据值
更新操作同插入操作一模一样,只不过有数据就更新,没数据就添加
2.更新版本号
将user表的info列族版本号改为5
alter 'user', NAME => 'info', VERSIONS => 5
3.
(8)删除数据以及删除表操作
1.指定rowkey以及列名进行删除
删除user表row key为rk0001,列标示符为info:name的数据
delete 'user', 'rk0001', 'info:name'
(9)HBase的高级shell管理命令
1.status
例如:显示服务器状态
hbase(main):058:0> status ‘node01’
2.whoami
显示HBase当前用户,例如:
hbase> whoami
3.list
显示当前所有的表
4.count
统计指定表的记录数,例如:
hbase> count ‘user’
5.describe
展示表结构信息
6.exists
检查表是否存在,适用于表量特别多的情况
7.is_enabled、is_disabled
检查表是否启用或禁用
8.alter
该命令可以改变表和列族的模式,例如:
为当前表增加列族:
hbase> alter ‘user’, NAME => ‘CF2’, VERSIONS => 2
为当前表删除列族:
hbase(main):002:0> alter ‘user’, ‘delete’ => ‘CF2’
9.disable/enable
禁用一张表/启用一张表
10.drop
删除一张表,记得在删除表之前必须先禁用
11.truncate
禁用表-删除表-创建表 得到一个空白的表,也叫清空表操作
5.HBase的Java代码开发
通过java程序实现对HBase数据库当中数据增删改差操作
(1)创建maven工程,导入jar包
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-server -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<!-- <verbal>true</verbal>-->
</configuration>
</plugin>
</plugins>
</build>
2.创建表myuser,并且带有两个列族f1,f2
package cn.it.hbase.demo;
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;
import org.junit.Test;
import java.io.IOException;
public class HBaseOpaerte {
/**
* 创建habase表myuser,来有两个列族
*/
@Test
public void createTable() throws IOException {
//1.设置conf
Configuration conf = HBaseConfiguration.create();
//2.指定hbase的zk连接地址
conf.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
//3.连接hbase集群
Connection connection = ConnectionFactory.createConnection(conf);
//4.获取管理员对象
Admin admin = connection.getAdmin();
//5.通过管理员对象创建表
HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf("myuser"));
//5.1添加列族
HColumnDescriptor f1 = new HColumnDescriptor("f1");
HColumnDescriptor f2 = new HColumnDescriptor("f2");
//5.2将两个列族设置到hTableDescriptor里面去
hTableDescriptor.addFamily(f1);
hTableDescriptor.addFamily(f2);
//5.3创建表
admin.createTable(hTableDescriptor);
admin.close();
connection.close();
}
}
(3)向表中添加数据
/**
* 向表中添加数据
*/
@Test
public void addData() throws IOException {
Configuration configuration = new Configuration();
configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
//获取连接
Connection connection = ConnectionFactory.createConnection(configuration);
//获取表对象
Table myuser = connection.getTable(TableName.valueOf("myuser"));
//添加数据
Put put = new Put("0001".getBytes());
put.addColumn("f1".getBytes(),"id".getBytes(), Bytes.toBytes(1));
put.addColumn("f1".getBytes(),"name".getBytes(), Bytes.toBytes("张三"));
put.addColumn("f1".getBytes(),"age".getBytes(), Bytes.toBytes(18));
put.addColumn("f2".getBytes(),"addres".getBytes(), Bytes.toBytes("地球人"));
put.addColumn("f2".getBytes(),"phone".getBytes(), Bytes.toBytes("12132432"));
myuser.put(put);
myuser.close();
}
(3)查询数据操作
在做查询之前先添加一批数据到表中,方便后续操作的演示
@Test
public void insertBatchData() throws IOException {
//获取连接
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181");
Connection connection = ConnectionFactory.createConnection(configuration);
//获取表
Table myuser = connection.getTable(TableName.valueOf("myuser"));
//创建put对象,并指定rowkey
Put put = new Put("0002".getBytes());
put.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(1));
put.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("曹操"));
put.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(30));
put.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
put.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("沛国谯县"));
put.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("16888888888"));
put.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("helloworld"));
Put put2 = new Put("0003".getBytes());
put2.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(2));
put2.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("刘备"));
put2.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(32));
put2.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
put2.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("幽州涿郡涿县"));
put2.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("17888888888"));
put2.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("talk is cheap , show me the code"));
Put put3 = new Put("0004".getBytes());
put3.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(3));
put3.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("孙权"));
put3.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(35));
put3.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
put3.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("下邳"));
put3.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("12888888888"));
put3.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("what are you 弄啥嘞!"));
Put put4 = new Put("0005".getBytes());
put4.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(4));
put4.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("诸葛亮"));
put4.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(28));
put4.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
put4.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("四川隆中"));
put4.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("14888888888"));
put4.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("出师表你背了嘛"));
Put put5 = new Put("0005".getBytes());
put5.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(5));
put5.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("司马懿"));
put5.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(27));
put5.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
put5.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("哪里人有待考究"));
put5.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("15888888888"));
put5.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("跟诸葛亮死掐"));
Put put6 = new Put("0006".getBytes());
put6.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(5));
put6.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("xiaobubu—吕布"));
put6.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(28));
put6.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
put6.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("内蒙人"));
put6.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("15788888888"));
put6.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("貂蝉去哪了"));
List<Put> listPut = new ArrayList<Put>();
listPut.add(put);
listPut.add(put2);
listPut.add(put3);
listPut.add(put4);
listPut.add(put5);
listPut.add(put6);
myuser.put(listPut);
myuser.close();
}
- 以下为查询操作
/**
* 查询rowkey为003的人,所有列
*/
@Test
public void getData() throws IOException {
//获取连接
configuration = new Configuration();
configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
connection = ConnectionFactory.createConnection(configuration);
//获取表
table = connection.getTable(TableName.valueOf("myuser"));
Get get = new Get("0003".getBytes());
//限制查询范围,只查询f1列族,
// get.addFamily("f1".getBytes());
//限制查询范围,只查询f1列族下的id列
// get.addColumn("f1".getBytes(),"id".getBytes());
//Result是一个对象,封装了所有的结果数据
Result result = table.get(get);
//获取003的所以cell值
List<Cell> cells = result.listCells();
for (Cell cell : cells) {
//获取列族名称
String familyName = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
//获取列名称
String columnNmae = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
if (familyName.equals("f1") && columnNmae.equals("age") || columnNmae.equals("id")) {
int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
System.out.println("列族名" + familyName + "列名" + columnNmae + "列的值" + value);
} else {
String value = Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
System.out.println("列族名" + familyName + "列名" + columnNmae + "列的值" + value);
}
}
table.close();
}
(4)通过scan进行扫描
/**
* 安装rowkey进行范围扫描
* 扫描rowkey0004到0006的所以值
*/
@Test
public void scanRange() throws IOException {
Configuration configuration = new Configuration();
configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
Connection connection = ConnectionFactory.createConnection(configuration);
Table table = connection.getTable(TableName.valueOf("myuser"));
Scan scan = new Scan();
//设置起始和结束的rowkey
scan.setStartRow("0004".getBytes()); //这里把范围注释掉运行就是全表扫描
scan.setStopRow("0006".getBytes());
//返回多条数据都封装在ResultScanner中了
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
List<Cell> cells = result.listCells();
for (Cell cell : cells) {
String rowkey = Bytes.toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
String fileName = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
String columnNmae = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
if (fileName.equals("f1") && columnNmae.equals("id") || columnNmae.equals("age")){
int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
System.out.println("数据的rowkey为"+rowkey+"数据的列族为"+fileName+"数据的列名"+columnNmae+"数据的值"+value);
}else {
String value = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
System.out.println("数据的rowkey为"+rowkey+"数据的列族为"+fileName+"数据的列名"+columnNmae+"数据的值"+value);
}
}
}
}
(5)过滤器查询
1.比较过滤器
- 通过RowFilter过滤rowKey
- 列族过滤器FamilyFilter
- 列过滤器QualifierFilter
- 列值过滤器ValueFilter
/**
* 使用rowFilter查询比0003小的所以的数据
*/
@Test
public void rowFileter() throws IOException {
Configuration configuration = new Configuration();
configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
Connection connection = ConnectionFactory.createConnection(configuration);
Table table = connection.getTable(TableName.valueOf("myuser"));
Scan scan = new Scan();
//*****核心点******
//添加一个比较过滤器
//通过RowFilter过滤rowKey中比0003小的rowkey中所有值出来
RowFilter rowFilter = new RowFilter(CompareOperator.LESS, new BinaryComparator(Bytes.toBytes("0003")));
scan.setFilter(rowFilter);
//列族过滤器
//查询比f2列族小的所有列族里面的数据
FamilyFilter f2 = new FamilyFilter(CompareOperator.LESS, new SubstringComparator("f2"));
scan.setFilter(f2);
//列过滤器
//只查询name列的值
QualifierFilter name = new QualifierFilter(CompareOperator.EQUAL, new SubstringComparator("name"));
scan.setFilter(name);
//值过滤器
//查询所有列当中包含8的数据
ValueFilter valueFilter = new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("8"));
scan.setFilter(valueFilter);
//*****核心点******
//返回的数据都封装在ResultScanner中,我们迭代遍历获取内容
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
List<Cell> cells = result.listCells();
for (Cell cell : cells) {
String rowkey = Bytes.toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
String fileName = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
String columnNmae = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
if (fileName.equals("f1") && columnNmae.equals("id") || columnNmae.equals("age")){
int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
System.out.println("数据的rowkey为"+rowkey+"数据的列族为"+fileName+"数据的列名"+columnNmae+"数据的值"+value);
}else {
String value = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
System.out.println("数据的rowkey为"+rowkey+"数据的列族为"+fileName+"数据的列名"+columnNmae+"数据的值"+value);
}
}
}
}
2.专用过滤器
- 单列值过滤器SingleColumnValueFilter会返回满足条件数据的所有字段
- 列值排除过滤器SingleColumnValueExcludeFilter会排除掉指定的列,其他的列全部返回
- rowkey前缀过滤器PrefixFilter
- 分页过滤器PageFilter
- 多过滤器综合查询FilterList
/**
* 使用rowFilter查询比0003小的所以的数据
*/
@Test
public void rowFileter() throws IOException {
Configuration configuration = new Configuration();
configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
Connection connection = ConnectionFactory.createConnection(configuration);
Table table = connection.getTable(TableName.valueOf("myuser"));
Scan scan = new Scan();
//*****核心点******
//添加一个专用过滤器
//单列值过滤器
//查询name值为 刘备 的数据
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), CompareOperator.EQUAL, "刘备".getBytes());
scan.setFilter(singleColumnValueFilter);
//前缀过滤器
//查询以00开头的所有前缀的rowkey
PrefixFilter prefixFilter = new PrefixFilter("00".getBytes());
scan.setFilter(prefixFilter);
//多过滤器综合查询FilterList()
//在上述两个过滤器实现完成的基础上,我们要使一个过滤器,拥有即是name为刘备,又rowkey是00开头的
FilterList filterList = new FilterList(singleColumnValueFilter, prefixFilter);
scan.setFilter(filterList);
//*****核心点******
//返回的数据都封装在ResultScanner中,我们迭代遍历获取内容
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
List<Cell> cells = result.listCells();
for (Cell cell : cells) {
String rowkey = Bytes.toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
String fileName = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
String columnNmae = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
if (fileName.equals("f1") && columnNmae.equals("id") || columnNmae.equals("age")){
int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
System.out.println("数据的rowkey为"+rowkey+"数据的列族为"+fileName+"数据的列名"+columnNmae+"数据的值"+value);
}else {
String value = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
System.out.println("数据的rowkey为"+rowkey+"数据的列族为"+fileName+"数据的列名"+columnNmae+"数据的值"+value);
}
}
}
}
- 以下代码是分页的实现
/**
* 实现hbase的分页的功能
*/
@Test
public void habasePage() throws IOException {
Configuration configuration = new Configuration();
configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
Connection connection = ConnectionFactory.createConnection(configuration);
Table table = connection.getTable(TableName.valueOf("myuser"));
int pageNum = 1; //
int pageSize = 2;
if(pageNum == 1){
Scan scan = new Scan();
//如果是查询第一页数据,就按照空来进行扫描
scan.withStartRow("".getBytes());
PageFilter pageFilter = new PageFilter(pageSize);
scan.setFilter(pageFilter);
//传入设置好的scan,对表进行扫描,返回的ResultScanner包含所扫描的数据
ResultScanner scanner = table.getScanner(scan);
//迭代遍历得到数据
for (Result result : scanner) {
byte[] row = result.getRow();
System.out.println(Bytes.toString(row));
}
}
}
(6)删除数据
1.根据rowkey删除某一条数据
/**
* 根据rowkey删除某一条数据
* @throws IOException
*/
@Test
public void deleteData() throws IOException {
Configuration configuration = new Configuration();
configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
Connection connection = ConnectionFactory.createConnection(configuration);
Table table = connection.getTable(TableName.valueOf("myuser"));
Delete delete = new Delete("0007".getBytes());
table.delete(delete);
}
2.删除表
/**
* 删除表
* @throws IOException
*/
@Test
public void deletTable() throws IOException {
Configuration configuration = new Configuration();
configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
Connection connection = ConnectionFactory.createConnection(configuration);
Table table = connection.getTable(TableName.valueOf("myuser"));
//获取管理员权限
Admin admin = connection.getAdmin();
//禁用表
admin.disableTable(TableName.valueOf("myuser"));
//删除表
admin.deleteTable(TableName.valueOf("myuser"));
}