14 数据模型操作

数据模型的操作

HBase 对数据模型的 4 个主要操作包括 Get、Put、Scan 和 Delete。 通过 HTbale 实例进行操作。

    HBase 所有修改数据的操作都保证行级别的原子性。要么读到最新的数据,要么等待系统允许写入改行的修改。

1 Get

HTable 类中提供了 get() 方法, 同时还有与之对应的 Get 类,Get 操作返回一行或多行数据

get方法 获取数据时,HBase 返回的结果包含所有匹配的单元格数据,这些数据将被封装在一个 Result 实例中 返回给用户。 用 Result 类提供的方法,可以从服务器端获取匹配指定行的特定返回值,这些值包括列族、列限定符和时间戳等。

Configuration conf = HBaseConfiguration.create();

Connection connection = ConnectionFactory.createConnection(conf);

Table table=connection.getTable(TableName.valueOf(tableName));

Get get=new Get(rowkey.getBytes());

Result result = table.get(get);

2 Put

Put可以一次插入一行也可以一次插入一个集合。

如果需要频繁修改某些行的数据,用户应该创建一个 RowLock 的实例来防止其他用户对该行数据进行修改。(HBase线程,HBase事物,HBase锁)

Put操作每次都会发起一次到服务器的RPC操作,如果有大量的数据要写入表中,就会有数千次 RPC 操作, 这样效率很低。 HBase客户端有一个缓冲区,负责将数据批量的仅通过一次 RPC 操作发送到服务端, 这样可以大大提高性能,默认客户端写缓冲区是关闭的,需要打开 (HBase优化)

当一个 Put 集合提交到服务端的时候,可能会出现部分成功部分失败的情况,失败的数据会被保存到缓存区中进行重试。

HBase 提供了一个 compare - and - set 操作, 这个操作先进行检查, 条件满足后再执行,这个操作对于行是有原子性的。

HBase 没有 Update 操作,是通过 Put 操作完成对数据的修改。

3 Scan

Scan操作允许多行特定属性迭代,使用方式与 Get 的方式相似。 工作方式类似于迭代器。startRow 定义扫描 HBase 表的起始行键。stopRow 限定读取的停止。

创建后默认扫描表的所有列族以及所有列。可以多种方法限定读取的数据。

Scan 有很多优化,用好 Scan 将给 HBase 查询带来极大的提升。

public static void main(String[] args) throws IOException {

//Scan类常用方法说明

//指定需要的family或column ,如果没有调用任何addFamily或Column,会返回所有的columns;

// scan.addFamily();

// scan.addColumn();

// scan.setMaxVersions(); //指定最大的版本个数。如果不带任何参数调用setMaxVersions,表示取所有的版本。如果不掉用setMaxVersions,只会取到最新的版本.

// scan.setTimeRange(); //指定最大的时间戳和最小的时间戳,只有在此范围内的cell才能被获取.

// scan.setTimeStamp(); //指定时间戳

// scan.setFilter(); //指定Filter来过滤掉不需要的信息

// scan.setStartRow(); //指定开始的行。如果不调用,则从表头开始;

// scan.setStopRow(); //指定结束的行(不含此行);

// scan.setBatch(); //指定最多返回的Cell数目。用于防止一行中有过多的数据,导致OutofMemory错误。

//过滤器

//1、FilterList代表一个过滤器列表

//FilterList.Operator.MUST_PASS_ALL -->and

//FilterList.Operator.MUST_PASS_ONE -->or

//eg、FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ONE);

//2、SingleColumnValueFilter

//3、ColumnPrefixFilter用于指定列名前缀值相等

//4、MultipleColumnPrefixFilter和ColumnPrefixFilter行为差不多,但可以指定多个前缀。

//5、QualifierFilter是基于列名的过滤器。

//6、RowFilter

//7、RegexStringComparator是支持正则表达式的比较器。

//8、SubstringComparator用于检测一个子串是否存在于值中,大小写不敏感。

HTable table=(HTable) getHTablePool().getTable("tb_stu");

Scan scan=new Scan();

scan.setMaxVersions();

//指定最多返回的Cell数目。用于防止一行中有过多的数据,导致OutofMemory错误。

scan.setBatch(1000);

//scan.setTimeStamp(NumberUtils.toLong("1370336286283"));

//scan.setTimeRange(NumberUtils.toLong("1370336286283"), NumberUtils.toLong("1370336337163"));

//scan.setStartRow(Bytes.toBytes("quanzhou"));

//scan.setStopRow(Bytes.toBytes("xiamen"));

//scan.addFamily(Bytes.toBytes("info"));

//scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("id"));

//查询列镞为info,列id值为1的记录

//方法一(单个查询)

// Filter filter = new SingleColumnValueFilter(

//         Bytes.toBytes("info"), Bytes.toBytes("id"), CompareOp.EQUAL, Bytes.toBytes("1"));

// scan.setFilter(filter);

//方法二(组合查询)

//FilterList filterList=new FilterList();

//Filter filter = new SingleColumnValueFilter(

//    Bytes.toBytes("info"), Bytes.toBytes("id"), CompareOp.EQUAL, Bytes.toBytes("1"));

//filterList.addFilter(filter);

//scan.setFilter(filterList);

ResultScanner rs = table.getScanner(scan);

for (Result r : rs) {

for (KeyValue kv : r.raw()) {

System.out.println(String.format("row:%s, family:%s, qualifier:%s, qualifiervalue:%s, timestamp:%s.",

Bytes.toString(kv.getRow()),

Bytes.toString(kv.getFamily()),

Bytes.toString(kv.getQualifier()),

Bytes.toString(kv.getValue()),

kv.getTimestamp()));

}

}

rs.close();

}

God has given me a gift. Only one. I am the most complete fighter in the world. My whole life, I have trained. I must prove I am worthy of someting.                                                             rocky_24

来自为知笔记(Wiz)

时间: 2024-08-06 09:37:07

14 数据模型操作的相关文章

C++ Primer学习总结 第14章 操作重载与类型转换

第14章 操作重载与类型转换 1.    可以直接调用重载的运算符函数. 但是如果对于一个运算符比如+号,既有重载的成员函数,又有重载的非成员函数,那么此时如果直接使用+号,那么就会出现错误. 因为编译器不知道要调用那个运算符. 2.     逗号,运算符 逻辑与&&运算符 逻辑或||运算符不建议重载. 因为上述3种运算符本身是有求值顺序和短路求值特性(&&和||有短路求值特性)的. 但是重载后的运算符本质上是一次函数调用, 所以求值顺序和短路求值特性都会消失. 注意上面第

Oracle 学习笔记 14 -- 集合操作和高级子查询

Oracel提供了三种类型的集合操作:各自是并(UNION) .交(INTERSECT). 差(MINUS) UNION :将多个操作的结果合并到一个查询结果中,返回查询结果的并集,自己主动去掉反复的部分. UNION ALL:将多个操作的结果合并到一个查询结果中,可是保留反复的内容. INTERSECT: 返回多个操作结果中同样的部分. MINUS:返回两个查询结果的差集,去掉反复的部分. 基本的语法格式为: SELECT * FROM  table_name 1 [union , union

从零开始的Python学习Episode 14——日志操作

日志操作 一.logging模块 %(message)s 日志信息 %(levelno)s 日志级别 datefmt 设置时间格式 filename 设置日志保存的路径 level 设置日志记录的级别 filemode:文件打开方式,在指定了filename时使用这个参数,默认值为"a"还可指定为"w","a"表示在原有的日志之后增添日志,"w"表示清除原有的日志后再添加新的日志. 配置日志级别.日志格式.输出位置 impor

14 文件操作

一.初识文件操作 使用python来读写文件是非常简单的操作. 我们使用open()函数来打开一个文件, 获取到文件句柄. 然后通过文件句句柄就可以进行行各种各样的操作了. 根据打开方式的不同能够执行的操作也会有相应的差异. 打开文件的方式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 二.读模式(r,rb) r 模式: f = open('test_r',mode='r',encoding='utf-8') data = f.read() #f

DayDayUP_Python自学教程[14]_python操作excel

参考链接:http://bookshadow.com/weblog/2014/10/19/python-xlwt-write-excel/?utm_source=tuicool&utm_medium=referral 感谢作者 安装包 如果需要使用Python写Excel文件,首先下载或者安装xlwt. 如果已经安装pip pip install xlwt 未安装pip # git clone https://github.com/python-excel/xlwt.git # cd 解压目录

从零自学Hadoop(21):HBase数据模型相关操作下

阅读目录 序 变量 数据模型操作 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 上一篇,我们讲述了HBase的数据模型相关操作的上部分.   下面我们开始介绍HBase的数据模型相关操作的下部分. 变量 一:定义变量 这样我们就可以使用t这个变量来代替table1了. t=get_table 'table1' 二:使用 t.put 'row1','cf1:a','v1' t.g

HBase介绍 (1)---数据模型

http://blog.csdn.net/heyutao007/article/details/5766896 BigTable是什么?Google的Paper对其作了充分的说明.字面上看就是一张大表,其实和我们想象的传统数据库的表还是有些差别的.松散数据可以说是介于Map Entry(key & value)和DB Row之间的一种数据.在我使用Memcache的时候,有时候的需求是需要存储的不仅仅是简单的一个key对应一个value,可能我需要类似于数据库表结构中多属性的存储,但是又不会有传

大坑:用SQLyog连mysql的部分操作不能同步到从库

线上有个业务是一主两从,今天下午有一个从库突然告警:1677错误,提示数据类型不能从smallint改成varchar(20),以前有遇到过这样的错误,设置参数set global slave_type_conversions=ALL_NON_LOSSY;重新start slave就可了,但是这次改了参数还是没有效果. 经过询问,dba都没有改过表结构,只是开发人员调整了栏位的顺序.查看报错的表的表结构,发现这个从库的表结构和主库的不一样.解析日志发现relaylog里面有相关的alter ta

Appium1.6 定位iOS元素和操作元素

元素定位方式  第一种:通过Appium1.6的Inspector来查看 具体安装方式前面的随笔已经介绍了:http://www.cnblogs.com/meitian/p/7360017.html 可以通过定位找到元素xpath或name 个人不推荐用这个方法,实际操作中发现,每次操作后点击刷新比较慢,而且有时左侧布局文件更新不及时,导致点击左侧屏幕的控件找不到元素,有时App Source根本就没更新 第二种:通过macaca的App inspector来定位元素 1.安装macaca-li