hbase数据库scan操作_HBase Scan 使用
1. Scan类常用方法说明
// 1. 指定需要的family或column,如果没有调用任何addFamily或Column,会返回所有的columns
scan.addFamily()
scan.addColumn()
// 2. 指定最大的版本个数。如果不带任何参数调用setMaxVersions,表示取所有的版本。如果不掉用setMaxVersions,只会取到最新的版本
scan.setMaxVersions()
// 3. 指定最大的时间戳和最小的时间戳,只有在此范围内的cell才能被获取
scan.setTimeRange()
// 4. 指定时间戳
scan.setTimeStamp()
// 5. 指定开始的行。如果不调用,则从表头开始
scan.setStartRow()
// 6. 指定结束的行(不含此行)
scan.setStopRow()
// 7. 指定最多返回的Cell数目。用于防止一行中有过多的数据,导致OutofMemory错误
scan.setBatch()
// 8. 指定Filter来过滤掉不需要的信息
scan.setFilter()
2. 比较运算符
HBase 内置以下7种比较运算符,在比较过滤器中需要用到比较运算符
public enum CompareOperator {
LESS,
LESS_OR_EQUAL,
EQUAL,
NOT_EQUAL,
GREATER_OR_EQUAL,
GREATER,
NO_OP;
private CompareOperator() {
}
}
3. 比较器
通过比较器可以实现多样化目标匹配效果,比较器有以下子类可以使用
BinaryComparator // 匹配完整字节数组
BinaryPrefixComparator // 匹配字节数组前缀
BitComparator // 按位执行与、或、异或比较
NullComparator // 判断当前值是不是 NULL
RegexStringComparator // 正则表达式匹配字符串
SubstringComparator // 子串匹配,相当于 contains(),大小写不敏感
4. Filter 过滤器
FilterList 代表一个过滤器列表,可以对多个Filter进行组合使用
FilterList.Operator.MUST_PASS_ALL --> and
FilterList.Operator.MUST_PASS_ONE --> or
Scan scan = new Scan();
Filter filter1 = new ...;
Filter filter2 = new ...;
Filter filter3 = new ...;
ilterList list = new FilterList(FilterList.Operator.MUST_PASS_ONE);
scan.setFilter(list);
(1) 比较过滤器
1)行键过滤器 RowFilter
筛选出匹配的所有的行,基于行键(Rowkey)过滤数据,可以执行精确匹配,子字符串匹配或正则表达式匹配,过滤掉不匹配的数据
一般来说,对 Rowkey 进行范围过滤,可以执行 Scan 的 startKey 和 endKey,RowFilter 可以更精确的过滤
Scan scan = new Scan();
RowFilter rowFilter = new RowFilter(CompareOperator.EQUAL, newBinaryComparator(Bytes.toBytes("00001")));
scan.setFilter(rowFilter);
2) 列族过滤器 FamilyFilter
与 RowFilter 类似,区别是比较列族,而不是比较行键。当HBase表有多个列族时,可以用来筛选不同列族中的列
Scan scan = new Scan();
FamilyFilter familyFilter = new FamilyFilter(CompareOperator.EQUAL, new BinaryComparator(Bytes.toBytes("info")));
scan.setFilter(familyFilter);
3)列名过滤器 QualifierFilter
根据列名进行筛选
Scan scan = new Scan();
QualifierFilter qualifierFilter = new QualifierFilter(CompareOperator.EQUAL, new BinaryComparator(Bytes.toBytes("userName")));
scan.setFilter(qualifierFilter);
4)值过滤器 ValueFilter
筛选特定值的单元格,可以与 RegexStringComparator 搭配使用,完成复杂的筛选
不同的比较器,只能与部分比较运算符搭配,例如 SubstringComparator 只能使用 EQUAL 或 NOT_EQUAL
Scan scan = new Scan();
ValueFilter valueFilter = new ValueFilter(CompareOperator.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("zhangsan")));
scan.setFilter(valueFilter);
5)DependentColumnFilter
一种更复杂的过滤器,不止简单的通过用户指定的信息筛选数据。允许指定一个参考列或引用列,使用参考列控制其他列的过滤。该过滤器会使用参考列的时间戳,并在过滤时包括所有与引用时间戳相同的列。
参考列过滤器相当于一个 ValueFilter 和一个时间戳过滤器的组合。
Scan scan = new Scan();
Filter dependentColumnFilter = new DependentColumnFilter(Bytes.toBytes("cf-d"),
Bytes.toBytes("col-1"),
false,
CompareOperator.EQUAL,
new BinaryComparator(Bytes.toBytes("val-1")));
scan.setFilter(filter);
(2) 专用过滤器
1)单列值过滤器 SingleColumnValueFilter
使用某一列的值,决定一行数据是否被过滤
对于不包含指定列的行数据,通过 setFilterIfMissing() 决定是否返回
Scan scan = new Scan();
Filter filter = new SingleColumnValueFilter(Bytes.toBytes("info"),Bytes.toBytes("id"), CompareOperator.EQUAL,Bytes.toBytes("1234"));
scan.setFilter(filter);
2) 单列值排除器 SingleColumnValueExcludeFilter
继承自 SingleColumnValueFilter,实现的与单列值过滤器相反的语义
Scan scan = new Scan();
Filter filter = new SingleColumnValueExcludeFilter(Bytes.toBytes("info"),Bytes.toBytes("id"), CompareOperator.EQUAL,Bytes.toBytes("1234"));
scan.setFilter(filter);
3)行前缀过滤器 PrefixFilter
基于行键(Rowkey)的前缀过滤行数据。Scan 操作以字典序查找,当行键大于前缀时,Scan 结束
Scan scan = new Scan();
Filter filter = new PrefixFilter(Bytes.toBytes("row1"));
scan.setFilter(filter);
4) 列前缀过滤器 ColumnPrefixFilter
通过对列名称的前缀匹配过滤,返回的结果只包含满足过滤器的列
Scan scan = new Scan();
ColumnPrefixFilter filter1 = new ColumnPrefixFilter(Bytes.toBytes("param"));
scan.setFilter(filter1);
5)列多前缀过滤器 MultipleColumnPrefixFilter
和ColumnPrefixFilter行为差不多,但可以指定多个前缀
Scan scan = new Scan();
byte[][] bytes = new byte[][]{Bytes.toBytes("param")};
MultipleColumnPrefixFilter columnPrefixFilter = new MultipleColumnPrefixFilter(bytes);
scan.setFilter(columnPrefixFilter);
6)分页过滤器 PageFilter
使用该过滤器,对结果进行按行分页,需要指定 pageSize 参数,控制每页返回的行数,并设置 startRow 多次调用 getScanner()
只适用于一些特殊场景,性能也并不高
Connection connection;
Table table = null;
try {
connection = ConnectionFactory.createConnection(new Configuration());
table = connection.getTable(TableName.valueOf("test"));
} catch (IOException e) {
e.printStackTrace();
}
byte[] lastRow = null;
// 每页10条数据
Filter pageFilter = new PageFilter(10);
int rowCount = 0;
while(rowCount < 10) {
Scan scan = new Scan();
scan.setFilter(pageFilter);
scan.withStartRow(lastRow);
ResultScanner resultScanner;
try {
assert table != null;
resultScanner = table.getScanner(scan);
for (Result result : resultScanner) {
// ...
// 记录最后一行的rowKey
lastRow = result.getRow();
// 记录本页行数
rowCount++;
}
} catch (IOException e) {
e.printStackTrace();
}
}
7)行键过滤器 KeyOnlyFilter
这个 Filter 只会返回每行的行键+列簇+列,而不返回值(value),对不需要值的应用场景来说,非常实用,减少了值的传递。构造方法可以设置lenAsValue参数(默认false),表示返回时,value 设为原列值的长度
KeyOnlyFilter filter = new KeyOnlyFilter();
KeyOnlyFilter filter = new KeyOnlyFilter(true);
8)首次行键过滤器 FirstKeyOnlyFilter
这个 Filter 仅仅返回每一行中的第一个cell的值,可以用于高效的执行行数统计操作,在扫描到第一个 cell 时,立即跳到下一行数据,性能相比全表扫描得到提升
FirstKeyOnlyFilter filter = new FirstKeyOnlyFilter();
9)包含结束的过滤器 InclusiveStopFilter
一般的扫描结果中,设置一个开始行键和一个终止行键,是前闭后开区间,不包含结束行,使用这个过滤器时将结束行加入到结果中
Filter filter = new InclusiveStopFilter(Bytes.toBytes("uid-10"));
10)时间戳过滤器 TimestampsFilter
当需要在扫描结果中对版本进行细粒度控制时,可以使用这个Filter 传入一个时间戳集合,对时间进行限制,只会返回与指定时间戳相同的版本数据,并且与设置时间戳范围共同使用
Scan scan = new Scan();
Filter filter = new TimestampsFilter(Arrays.asList(5L, 10L, 15L));
scan.readVersions(3);
scan.setFilter(filter);
Scan scan2 = new Scan();
scan2.readVersions(3);
scan2.setFilter(filter);
scan2.setTimeRange(8L, 12L);
11)列计数过滤器 ColumnCountGetFilter
使用这个过滤器,限制每行最多返回多少列。注意当一行的列数达到设定的最大值,过滤器会停止 Scan 操作,所以不适合全表扫描,适合在 Get 方法中使用
Scan scan = new Scan();
Filter filter = new ColumnCountGetFilter(10);
scan.setFilter(filter);
12)列分页过滤器 ColumnPaginationFilter
与 PageFilter 类似,可以对一行的所有列进行分页,需要传入偏移量 offset 和返回数量 limit
ColumnPaginationFilter(int limit, int offset)
Scan scan = new Scan();
Filter filter = new ColumnPaginationFilter(10,5);
scan.setFilter(filter);
13)随机行过滤器 RandomRowFilter
这个 Filter 可以使结果中包含随机行,参数 chance 取值在 0.0 到 1.0 之间,表示随机取行数的比例,每一行会调用 Random.nextFloat() 与 chance 比较来确定是否被过滤
Scan scan = new Scan();
Filter filter = new RandomRowFilter(0.5F)
scan.setFilter(filter);
(3)其他过滤器
普通过滤器可以提供对返回结果的筛选限制,一些额外的控制可以附加在过滤器上
1)跳转过滤器 SkipFilter
包装了用户的一个过滤器,当过滤器发现某一行的一列需要过滤时,整行数据都被过滤掉。
下面的例子是,使用 SkipFilter 和 ValueFilter 组合,获取不等于指定列值的行,同时过滤掉其他不符合条件的行(即只要有一行中一列的值等于“val-0”,就会被过滤)
Scan scan = new Scan();
Filter filter1 = new ValueFilter(CompareFilter.CompareOp.NOT_EQUAL,
new BinaryComparator(Bytes.toBytes("val-0")));
Filter filter2 = new SkipFilter(filter1);
2)全匹配过滤 WhileMatchFilter
与SkipFilter 相似,不过当一条数据被过滤掉时,会停止 Scan 操作。可以用来检查全表数据中,是否有某些数据不符合条件
Scan scan = new Scan();
Filter filter1 = new ValueFilter(CompareFilter.CompareOp.NOT_EQUAL,
new BinaryComparator(Bytes.toBytes("val-0")));
Filter filter2 = new WhileMatchFilter(filter1);
hbase数据库scan操作_HBase Scan 使用相关推荐
- hbase数据库scan操作_HBase最佳实践之Scan
一.简介 HBase中Scan从大的层面来看主要有三种常见用法:ScanAPI.TableScanMR以及SnapshotScanMR.三种用法的原理不尽相同,扫描效率当然相差甚远,最重要的是这几种用 ...
- HBase(2) Java 操作 HBase 教程
一.简介 在上一篇文章 HBase 基础入门 中,我们已经介绍了 HBase 的一些基本概念,以及如何安装使用的方法. 那么,作为一名 Javaer,自然是希望用 Java 的方式来与 HBase 进 ...
- hbase scan超时设置_hbase scan超时问题
下面是异常信息: 2018-11-08 16:55:52,361 INFO [main] org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl ...
- HBaseAPI——IDEA操作HBase数据库HBase与Hive的集成
目录 一.IDEA操作HBase数据库 (一)添加依赖 (二)配置log4j (三)IDEA连接HBase并插入数据 1.代码实现 2.查看命名空间的表 (四)java操作HBase数据库--单元测试 ...
- Hbase数据库完全分布式搭建以及java中操作Hbase
文章目录 1.基础的环境准备 2.完全分布式 Fully-distributed 2.1 配置文件hase-env.sh 2.2 hbase-site.xml 2.3 配置regionservers ...
- 大数据-NoSQL数据库-HBase操作框架:Phoenix【Java写的基于JDBC API的操作HBase数据库的SQL引擎框架;低延迟、事务性、可使用sql语句、提供JDBC接口】
一.Phoenix概述 1.Phoenix 定义 Phoenix 最早是 saleforce 的一个开源项目,后来成为 Apache 的顶级项目. Phoenix 构建在 HBase 之上的开源 SQ ...
- 大数据——HBase数据库操作实例
大数据--四种数据库(MySQL,HBase,MongoDB,Redis)操作实例 问题描述: Student学生表 1. 根据上面给出的表格,用Hbase Shell模式设计student学生表格. ...
- java redis keys_jedis keys和scan操作
KEYS pattern 查找所有符合给定模式 pattern 的 key . KEYS * 匹配数据库中所有 key . KEYS h?llo 匹配 hello , hallo 和 hxllo 等. ...
- hbase数据库_hbase 什么类型的数据库
1.HBase和MR集成1.1 意义1.2 如何集成?1.3 官方案例1.4 自定义案例一(表1 -> 表2)1.4.1 需求1.4.2 注意事项1.4.3编写mapper类1.4.4 编写 ...
- SpringBoot 使用Phoenix操作HBase数据库教程
SpringBoot 使用Phoenix操作HBase数据库教程 文章目录 添加 Phoenix 相关依赖 控制器实现Hbase数据库操作 好的html源码下载 文章目录 借助 Apache Phoe ...
最新文章
- Linux 下解压文件命令大全
- bootstrap table相关操作
- 第二:Git如何将本地项目上传到Github(超详解)
- 实战ReactNative 从入门到精通 重要技术解析,5分钟搭建iOS, Android App 实战一
- php 将日期转换时间戳,php怎么将日期转换为时间戳?
- Error: could not open `C:\Program Files\Java\jre6\lib\i386\jvm.cfg'
- python做算法题优势_算法优点和缺点汇总(推荐AAA)
- 讯飞在线语音TTS队列策略
- 直播功能引入微信小程序
- 新手小白学JAVA-显示系统中文件的后缀名
- pig和piglet有什么区别?
- 安装Cab升级文件的6个方法
- CiteSpace采用WOS导入文献数据分析(四)
- 安装群晖系统入门图文教程
- 一个日本人写的插件:Breath Controller
- iOS开发入门——项目创建
- LA 4513 Stammering Aliens
- PF-EPF-UPF的对比仿真
- 浅议6S管理与改善的目的
- 2014年上半年(第39次)全国计算机等级考试成绩查询,2014上半年全国计算机等级成绩(39次)...
热门文章
- 搜狗浏览器显示无法解析服务器的DNS地址,搜狗浏览器显示无法解析DNS地址的解决方法...
- python以写模式打开的文件无法进读操作_以写模式打开的文件无法进行读操作。...
- PS2019渐变工具、油漆桶工具、3D材质拖放工具
- 【数据分析与科学计算可视化】numpy 和 matplotlib库总结
- uni-app 压缩图片
- 从kubernetes看如何设计超大规模资源调度系统
- linux 恢复member1账户,Linux操作系统第9讲 帐户管理和权限管理.ppt
- 【脑洞大开】智慧海洋网课答案
- 工业互联网的内涵及其应用
- win10系统禁用音频服务器,Win10下怎样设置禁用扬声器、插入耳机有声音【图文教程】...