传统的关系型数据库有CRUD增删改查操作,同样对于NoSQL列式数据库也有CRUD操作。本文对HBase中常用的Scan、GET、PUT、DELETE操作的用法做个总结。

Put操作

Put相当于传统数据库的add操作,就是在数据库中添加一条或多条记录。

Put操作分为两类,一类是一次操作一条记录,另外一类是一次操作多条数据。

HBase提供一个Put类,通过该类的对象就可以在HBase中添加数据。

Put类提供的构造函数如下:

Put(byte[] row)
Put(byte[] row,RowLock rowLock)
Put(byte[] row,long ts)
Put(byte[] row,long ts,RowLock rowLock)

通过上面的构造函数可以知道在创建对象时需要提供一个byte[]类型的参数row,该参数的主要作用是作为一行数据的行键(row key),和关系型数据库中的主键是一样的,是一行数据的唯一键。

Put提供如下的add方法将数据写入到HBase中:

Put add(byte[] family,byte[] qualifier,byte[] value)
Put add(byte[] family,byte[] qualifier,long ts,byte[] value)
Put add(KeyValuee kv)throws IOException

使用Put add(byte[] family,byte[] qualifier,byte[] value)方法添加数据时,因为没有指定时间戳,因此时间戳由region服务器提供。

使用Put add(byte[] family,byte[] qualifier,long ts,byte[] value) 方法添加数据时,由时间戳由参数ts指定。

使用Put add(KeyValue kv)throws IOException添加数据时,将行键、列族、列限定符、时间戳和单元格值封装为一个KeyValue对象。

将一行数据输入到HBase中的代码:

public class HBasePut{
public static void main(String[] args)throws IOExcetion{
//通过加载hbase-default.xml和hbase-site.xml文件的配置生成Configuration对象
Configuration conf = HBaseConfiguration.create(); //创建HTable对象,用于操作HBase中的bigdata17_table表
HTable table = new HTable(conf,"bigdata17_table");
//创建Put对象,并制定这行数据的行键bigdata17_row1
Put put = new Put(Bytes.toBytes("bigdata17_row1"));
//添加名为colfam1:qual1列,并设置值为val1
put.add(Bytes.toBytes("colfaml"),Bytes.toBytes("qual1"),Bytes.toBytes("val1"));
//将数据插入到表bigdata17_table
table.put(put);
}
}

将多行数据插入到HBase表中的代码:

List<Put> puts = new ArrayList<Put>();

Put put1 =  new Put(Bytes.toBytes("bigdata17_row1"));
put1.add(Bytes.toBytes("colfaml"),Bytes.toBytes("qual1"),Bytes.toBytes("val1"));
puts.add(put1); Put put2 = new Put(Bytes.toBytes("bigdata17_row2"));
put2.add(Bytes.toBytes("colfam2"),Bytes.toBytes("qual2"),Bytes.toBytes("val2"));
puts.add(put2); Put put3 = new Put(Bytes.toBytes("bigdata17_row2"));
put3.add(Bytes.toBytes("colfam1"),Bytes.toBytes("qual2"),Bytes.toBytes("val3"));
puts.add(put3); table.put(puts);

和一次添加一条数据的区别是,使用了ArrayList列表,将要插入的多条数据存储于ArrayList中。

Get操作

get操作用于从HBase中读取数据,和Put一样,也有两类操作,一次读取一条记录,一次读取多条记录。

Get提供的构造函数如下的:

Get(byte[] row)

Get(byte[] row,RowLock rowLock)

通过上述的构造函数可知在创建Get对象时必须指定行键。RowLock参数的Get构造函数允许用户设置行锁。

HBase读取数据的方法:

Result get(Get get)throws IOException

Get类提供给了如下的方法用于设置精确坐标读取某个单元格的数据:

Get addFamily(byte[] family)
Get addColumn(byte[] family,byte[] qualifier)
Get setTimeRange(long minStamp,long maxStamp)throws IOException
Get setTimeStamp(long timestamp)
Get setMaxVersions()
Get setMaxVersions(int maxVersion)throws IOException

addFamily方法限制了一次只能读取一个指定的列族,多次调用可以取得多个列族。

addColumn方法用于获取指定列的数据。

setTimeStamp方法限制了读取指定时间戳的数据。

setTimeRange用于读取某个时间戳范围内的数据。

setMaxVersions()方法读取当前最大版本的数据。

setMaxVersions(int maxVersion)throws IOException方法用于读取指定版本的数据。

get方法读取到最新版本的数据,也是版本号最大的数据。在调用get方法之前调用setMaxVersions(int maxVersion),就可以读取到所有版本的数据。

读取一行数据的代码:

Configuration conf = HBaseConfiguration().create();
HTable table = new HTable(conf,"bigdata17_table");
Get get = new Get(Bytes.toBytes("bigdata17_row1"));
get.addColumn(Bytes.toBytes("colfam1"),Bytes.toBytes("qual1"));
Result result = table.get(get);
byte[] val = result.getValue(Bytes.toBytes("colfam1"),Bytes.toBytes("qual1"));
System.out.println("Value:" + Bytes.toString(val));

HBase提供读取多行数据的方法:

Result[] get(List gets)throws IOException

下面是读取多行数据的代码:

byte[] colfam1 = Byte.toBytes("colfam1");
byte[] qual1 = Byte.toBytes("qual1");
byte[] qual2 = Byte.toBytes("qual2");
byte[] row1 = Byte.toBytes("bigdata17Row1");
byte[] row2 = Byte.toBytes("bigdata17Row2"); Configuration conf = HBaseConfiguration().create();
HTable table = new HTable(conf,"bigdata17_table"); List<Get> gets = new ArrayList<Get>();
Get get1 = new Get(row1);
get1.addColumn(colfam1,qual1);
gets.add(get1); Get get2 = new Get(row2);
get2.addColumn(colfam1,qual1);
gets.add(get2); Get get3 = new Get(row3);
get3.addColumn(colfam1,qual2);
gets.add(get3); Result[] results = table.get(gets); //循环results数组,读取每个返回的Result结果
for(Result result : results){
String row = Bytes.toString(result.getRow());
byte[] val1 = null;
if(result.containColumn(colfam1,qual1)){
val1 = result.getValue(colfam1,qual1);
System.out.println("Value1:" + Bytes.toString(val1));
} byte[] val2 = null;
if(result.containColumn(colfam1,qual2)){
val2 = result.getValue(colfam1,qual2);
System.out.println("Value2:" + Bytes.toString(val2));
}
} //使用KeyValue方式迭代Results中的数据
for(Result result : results){
for(KeyValue kv : result.raw()){
System.out.println("Row:" + Bytes.toString(kv.getRow()) + " Value:" + Bytes.toString(kv.getValue()));
}
}

Delete操作

HBase同样也提供删除数据的操作,由Delete类来执行。

Delete类提供了两个构造函数:

Delete(byte[] row)

Delete(byte[] row,long timestamp,RowLock rowLock)

Delete类提供了如下的方法用于在删除数据的过程中缩小数据的范围,类似关系型数据库的where条件:

Delete deleteFamily(byte[] family)删除整个列族的所有版本数据
Delete deleteFamily(byte[] family,long timesamp)删除时间戳早于给定timesamp的数据,包含timesamp。
Delete deleteColumns(byte[] family,byte[] qualifier)删除列族中指定列的所有版本数据。
Delete deleteColumns(byte[] family,byte[] qualifier,long timestamp)删除和时间戳版本匹配的数据以及比指定时间戳早的版本的数据
Delete deleteColumn(byte[] family,byte[] qualifier)只删除指定列中的最新版本的数据
Delete deleteColumn(byte[] family,byte[] qualifier,long timestamp)只删除指定列中的和timpstamp匹配版本的数据。
void setTimestamp()设置时间戳,这个方法在调用其他3种方法时经常被忽略。但是如果不指定列族或列,则次调用与删除整行不同,它会删除匹配时间戳的或者比给定时间戳旧的所有列族中的所有列。

deleteColumns()和deleteColumn()的区别是,前者删除多个版本的数据,后者只删除指定版本的数据。

Delete同样也提供删除单行和多行的数据。

删除单条数据的代码如下:

Delete delete = new Delete(Bytes.toBytes(bigdata1iRow1));

delete.setTimestamp(1);

delete.deleteColumn(Bytes.toBytes("colfam1"),Bytes.toBytes("qual1"),1);

delete.deleteColumns(Bytes.toBytes("colfam2"),Bytes.toBytes("qual1"));

delete.deleteColumn(Bytes.toBytes("colfam2"),Bytes.toBytes("qual3"),15);

delete.deleteFamily(Bytes.toBytes("colfam3"));

delete.deleteFamily(Bytes.toBytes("colfam3"),3);

table.delete(delete);

删除多条数据的代码:

List<Delete> deletes = new ArrayList<Delete>();

Delete delete1 = new Delete(Bytes.toBytes("bigdata17Row1"));
delete1.setTimestamp(4);
deletes.add(delete1); Delete delete2 = new Delete(Bytes.toBytes("bigdata17Row2"));
delete2.deleteColumn(Bytes.toBytes("colfam1"),Bytes.toBytes("qual1"),1);
deletes.add(delete2); Delete delete3 = new Delete(Bytes.toBytes("bigdata17Row3"));
delete.deleteFamily(Bytes.toBytes("colfam3"));
delete.deleteFamily(Bytes.toBytes("colfam3"),3);
deletes.add(delete3); table.delete(deletes);

一起学HBase——总结HBase中的PUT、GET、DELETE操作的更多相关文章

  1. 在Azure HDInsight HBase集群中使用Thrift接口

    Sun wei  Wed, Feb 25 2015 2:17 AM Apache Thrift 是一种可扩展的跨语言服务接口,可以通过内置的代码生成引擎帮助创建跨语言服务类库,Apache HBase ...

  2. 十八、Hadoop学记笔记————Hbase架构

    Hbase结构图: Client,Zookeeper,Hmaster和HRegionServer相互交互协调,各个组件作用如下: 这几个组件在实际使用过程中操作如下所示: Region定位,先读取zo ...

  3. HBase数据库配置中各配置项的释义及默认值

    2018-11-26 16:09 2018-12-20 15:44 摘自HBASE官方网站  http://hbase.apache.org/book.html#_introduction  第7.2 ...

  4. 在Eclipse中运行JAVA代码远程操作HBase的示例

    在Eclipse中运行JAVA代码远程操作HBase的示例 分类: 大数据 2014-03-04 13:47 3762人阅读 评论(2) 收藏 举报 下面是一个在Windows的Eclipse中通过J ...

  5. HBase原理 – 分布式系统中snapshot是怎么玩的?(转载)

    snapshot(快照)基础原理 snapshot是很多存储系统和数据库系统都支持的功能.一个snapshot是一个全部文件系统.或者某个目录在某一时刻的镜像.实现数据文件镜像最简单粗暴的方式是加锁拷 ...

  6. 【HBase】HBase Getting Started(HBase 入门指南)

    入门指南 1. 简介 Quickstart 会让你启动和运行一个单节点单机HBase. 2. 快速启动 – 单点HBase 这部分描述单节点单机HBase的配置.一个单例拥有所有的HBase守护线程- ...

  7. 【hbase】——HBase 写优化之 BulkLoad 实现数据快速入库

    1.为何要 BulkLoad 导入?传统的 HTableOutputFormat 写 HBase 有什么问题? 我们先看下 HBase 的写流程: 通常 MapReduce 在写HBase时使用的是 ...

  8. HBase(七): HBase体系结构剖析(下)

    目录: write Compaction splite read Write: 当客户端发起一个Put请求时,首先根据RowKey寻址,从hbase:meta表中查出该Put数据最终需要去的HRegi ...

  9. Hbase总结(一)-hbase命令,hbase安装,与Hive的区别,与传统数据库的区别,Hbase数据模型

    Hbase总结(一)-hbase命令 下面我们看看HBase Shell的一些基本操作命令,我列出了几个常用的HBase Shell命令,如下: 名称 命令表达式 创建表 create '表名称', ...

随机推荐

  1. Tesseract-ocr 安装与使用

    Tesseract(识别引擎),一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition , 光学字符识别)引擎,与Microsoft Offic ...

  2. Django admin组件源码流程

    admin 组件 Django 自带的用户后台组件 用于用户便携的操作 admin 组件核心 启动 注册 设计url 启动核心代码 每个app 通过 apps.py 扫描 admin.py 文件 并执 ...

  3. 20165223 《信息安全系统设计基础》 实现mypwd

    一.学习pwd命令 1. pwd命令简介 英文原名:Print Working Directory 指令功能:打印出当前工作目录 执行权限:All User 指令所在路径:/usr/bin/pwd 或 ...

  4. BZOJ2870 最长道路

    题意:给定树,有点权.求一条路径使得最小点权 * 总点数最大.只需输出这个最大值.5w. 解:树上路径问题,点分治. 考虑合并两个子树的时候,答案的形式是val1 * (d1 + d2),当1是新插入 ...

  5. 第三十九篇-RecyclerView的使用

    RecyclerView介绍 RecyclerView的出现可以替代ListView,并且比ListView更高级且更具灵活性.如果有数据集合,其中的元素将因用户操作或网络事件而在运行时发生改变,请使 ...

  6. 解决ssh登录慢的问题

    修改文件/etc/ssh/sshd_config  : UseDNS no GSSAPIAuthentication no 重启服务 service sshd restart

  7. Docker:容器的四种网络类型 [十三]

    一.None类型 简介:不为容器配置任何网络功能,--net=none 1.创建容器 docker run -it --network none busubox:latest 2.功能测试 [root ...

  8. MySQL的一些基本命令笔记(4)

    delete 语句嵌套子查询: delete from 表名1 where 列名 操作符 (select 列名 from 表名2 where 条件); 示例: delete from customer ...

  9. topshelf 服务启动运行

    topshlf 服务启动运行方式 安装:servicename.exe install 启动:servicename.exe start 卸载:servicename.exe uninstall

  10. DeepLearning.ai学习笔记(五)序列模型 -- week2 自然语言处理与词嵌入

    一.词汇表征 首先回顾一下之前介绍的单词表示方法,即one hot表示法. 如下图示,"Man"这个单词可以用 \(O_{5391}\) 表示,其中O表示One_hot.其他单词同 ...