HBase Scan命令详解
hbase中scan命令是我们经常使用到的,而filter的作用尤其强大。这里简要的介绍下scan下filter命令的使用.
插入scan命令需要的数据
这里模拟了部分微博评论的数据,然后使用代码插入数据到hbase,代码就不列出来了比较简单。
public class Comment {//1-->普通文章,2--->热点文章Integer articleType;//文章idString articleId;String userId;long timestamp;//comment content,暂时只考虑文本String commentContent;
}
hbase的表名称为zy_comment,列簇info下有articleType以及commentInfo两个列。commentInfo的value为上面Comment类的json字符串,插入的数据如下所示
HBase数据顺序
HBase是三维有序存储的,是指rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度是依照ASCII码表排序的。(比如A排在a前面)
- 先rowkey升序排序,
- rowkey相同则column key升序排序
- rowkey、column key相同则timestamp降序排序
支持的Filter
scan命令我们经常会大量使用Filter,hbase shell提供的filter都可以在hbase client包中找到对应的类,它们都是Filter的子类,很多命令都是通过filter来进行实现的。
使用show_filters
命令查看shell中定义了哪些filter常量,如果想要使用shell中未定义的常量,在使用的时候必须手动import filter的全路径。
scan的用法
使用 help 'scan'
命令可以查看scan的语法以及用法,关于scan命令中filter的使用规则如下:
scan 'tableName',{FILTER=>"FilterName(param1,param2,...,paramN)"}
{}中的语法是ruby的map的语法,FILTER必须大写,filter的参数是根据构造方法来的,也就是相当于java中的new Filter(‘param1’,‘param2’)等,这里只是省略了new参数而已。
当然同样可以使用ruby中new对象的方式,只是那样就必须使用全限定名称。后面会举一个全限定名称的例子。
在使用Filter的过程中部分filter会用到比较器(CompareOperator.java)以及运算比较符(ByteArrayComparable.java)
@Public
public enum CompareOperator {LESS, // <LESS_OR_EQUAL, // <=EQUAL, // =NOT_EQUAL, // <>GREATER_OR_EQUAL, // >=GREATER, // >NO_OP; // 没有任何操作private CompareOperator() {}
}
比较器主要有以下几种:
- BinaryComparator
按字节索引顺序比较指定字节数组,采用Bytes.compareTo(byte[]),比如:binary:\x00\x00\x02 - BinaryPrefixComparator
跟前面相同,只是比较左端的数据是否相同,比如:binaryprefix:\x00\x00 - NullComparator
判断给定的是否为空,不常用 - BitComparator
按位比较 a BitwiseOp class 做异或,与,并操作,不常用 - RegexStringComparator
提供一个正则的比较器,仅支持 EQUAL 和非EQUAL,比如:regexstring:ab*add - SubstringComparator
判断提供的子串是否出现在table的value中。比如:substring:great
scan例子
查询方式通过rowKey来进行查询是最快的,所以rowkey的设计一定要合理,如果不合理会很影响查询速率。但是有时候确实没有办法完全通过rowkey来查询,所以就要借助scan.
scan命令支持的修饰词除了列(COLUMNS
)修饰词外,HBase还支持Limit
(限制查询结果行数),STARTROW
(ROWKEY起始行。会先根据这个key定位到region,再向后扫描)、STOPROW
(结束行)、TIMERANGE
(限定时间戳范围)、VERSIONS
(版本数)、和FILTER
(按条件过滤行)等
- 查询user是zhangsan的用户的评论数据,最多只返回10条
scan 'zy_comment',{LIMIT=>10,FILTER=>"PrefixFilter('zhangsan')"}
通过startrow,stoprow来进行查询(这种也比较快,实际操作中如果不能通过rowkey)
scan 'zy_comment',{STARTROW=>'b',STOPROW='e',LIMIT=>10}
查询评论内容为666的评论有哪些
scan 'zy_comment',{LIMIT=>10,FILTER=>"ValueFilter(=,'substring:666')"}
- 查询热点文章的数据有哪些
scan 'zy_comment',{LIMIT=>10,FILTER="SingleColumnValueFilter('info','articleType',=,'binary: \x00\x00\x00\x00\x00\x00\x00\x02')"}
这里binary中的数据一定要是二进制字符串而不是具体的值
- 查看评论包含great的热点文章评论有哪些
scan 'zy_comment',{LIMIT=>3,FILTER=>"(SingleColumnValueFilter('info','articleType',=,'binary:\x00\x00\x00\x00\x00\x00\x00\x02')) AND (ColumnPrefixFilter('commentInfo') AND ValueFilter(=,'substring:great'))"}
- 查询评论的前两条
scan 'zy_comment',{FILTER=>"PageFilter(2)"}
和LIMIT有异曲同工之妙
- 查询rowkey中包含特定前缀的数据
scan 'zy_comment',{FILTER=>"RowFilter(=,'substring:zhangsan')"}
- 使用全限定名称查询articleId是123456的数据
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter
import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.SubstringComparatorscan 'zy_comment', {COLUMNS=>['info:commentInfo'], FILTER =>
SingleColumnValueFilter.new(Bytes.toBytes('info'), Bytes.toBytes('commentInfo'),
CompareFilter::CompareOp.valueOf('EQUAL'), SubstringComparator.new('123456'))}
注意
- 如果scan中指定了COLUMNS,则FILTER中所使用的列需要包含在所指定的COLUMNS中,否则,filter不起作用。
- HBase中主要的操作对象是一个个的cell,每个cell都可以有多个版本。如果使用过滤器ValueFilter,就会只有那些符合条件的cell被查出来。跟关系数据库的查询不同,关系数据库查出来的结果中各行都有相同的列。而HBase,查出来的结果中,不同的行会有不同的列。
- filter不会降低服务方的IO,它会把符合条件的子集传给客户端。即,它是在对查出的结果进行过滤,而不是象原来sql中的where子句。所以,如果要查出的结果中不包含filter需要的列,则filter就不能发挥作用。
参考文章
https://acadgild.com/blog/different-types-of-filters-in-hbase-shell
https://blog.csdn.net/u012185296/article/details/47338549
HBase Scan命令详解相关推荐
- Linux的scan命令,clamscan-Linux查毒工具的命令详解
clamscan-Linux查毒工具的命令详解 clamscan命令用于扫描文件和目录,一发现其中包含的计算机病毒,clamscan命令除了扫描linux系统的病毒外,主要扫描的还是文件中包含的win ...
- net user命令详解
net use \\ip\ipc$ " " /user:" " 建立IPC空链接 net use \\ip\ipc$ "密码" /user ...
- Redis命令详解:Hashs
Hash是一种String类型的field.value的映射表,因此,它非常适合存储对象.下面我们来一一介绍与Hash相关的命令. HDEL 最早可用版本:2.0.0 时间复杂度:O(N),其中N为要 ...
- Linux 学习之路 (三):用户管理命令详解
用户管理命令详解 useradd [options] USERNAME -u UID(>=500,并且与其他用户无重复) -g GID(基本组,组必须事先存在) -G GID,- ( ...
- 网络安全nmap扫描端口命令详解linux网络探测
简介: nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端.确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting).它是网络管理员必用的 ...
- Linux常用命令详解(最全)
Linux命令目录 Linux命令集合 系统信息 关机 (系统的关机.重启以及登出 ) 文件和目录 文件搜索 挂载一个文件系统 磁盘空间 用户和群组 文件的权限 - 使用 "+" ...
- Nmap命令详解及常用命令总结
Nmap学习 文章目录 Nmap学习 0 Nmap 介绍 1 Nmap命令详解 1.1 Nmap 命令help详解(内附中文翻译) 1.2 Nmap 命令思维导图 2 Nmap 常见使用场景以及相关命 ...
- md0和md1linux软raid,linux下Raid及mdadm命令详解
linux下Raid及mdadm命令详解 1.RAID级别:仅代表磁盘组织方式不同,没有高低之分: Raid常用种类:raid0,raid1,raid5,raid10,raid01 jbod:叠加硬盘 ...
- MySQL调试--explain命令详解
原文网址:MySQL调试--explain命令详解_IT利刃出鞘的博客-CSDN博客 简介 本文介绍MySQL的explain命令的用法及其结果的含义. explain作用 概述 在 SELECT 语 ...
最新文章
- SharePoint迁移和升级方案
- [shell]简单的shell提示和参数脚本
- NFS企业级网络文件共享
- FPGA中状态机的稳定性
- ftp上传和下载命令
- Spring : lombok : 注解@Slf4j
- Visual Studio 201~ Code 格式检查
- java定时每周执行一次_Spring 定时任务如何实现每周一某个时间执行?
- Android矢量绘图
- webview 边距_张虹亮'blog » android中的dialog默认离屏幕的边距如何去除(即如何全屏)...
- 北大计算机山西,2019年山西省清华、北大录取人数及招生情况整理汇总
- 拼多多——多多的字符变换
- python mongodb分页查询_python数据库分页查询语句
- 联想计算机不能进入系统桌面,win10电脑开机后进不了系统桌面只有联想logo
- JavaScript 内存溢出,内存泄漏
- 模电——磁珠的前世今生
- win10 如何开启guest
- Pillar-based Object Detection for Autonomous Driving(基于柱体的自动驾驶目标检测)论文笔记
- 解读最佳实践:倚天710 ARM芯片的 Python+AI 算力优化
- 蓝桥杯 BASIC-3 字母图形**
热门文章
- 利用CVX使用ADMM算法的注意点
- vscode前端环境(html+css+javascript)的配置
- 导线截面积和电流的关系
- ASCII码、Unicode编码对照表 —— ASCII控制字符 Unicode编码 字符编码的前世此生
- “早安、午安、晚安” Game Jam
- Acrobat_8_Pro_SC 激活老是提示你输入的授权码无效
- PX4装机教程(八)常用硬件
- Elastic-job实现分布式定时任务
- 算法精解一(C语言版)
- 广告素材优选算法在内容营销中的应用实践