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前面)

  1. 先rowkey升序排序,
  2. rowkey相同则column key升序排序
  3. 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() {}
}

比较器主要有以下几种:

  1. BinaryComparator
    按字节索引顺序比较指定字节数组,采用Bytes.compareTo(byte[]),比如:binary:\x00\x00\x02
  2. BinaryPrefixComparator
    跟前面相同,只是比较左端的数据是否相同,比如:binaryprefix:\x00\x00
  3. NullComparator
    判断给定的是否为空,不常用
  4. BitComparator
    按位比较 a BitwiseOp class 做异或,与,并操作,不常用
  5. RegexStringComparator
    提供一个正则的比较器,仅支持 EQUAL 和非EQUAL,比如:regexstring:ab*add
  6. SubstringComparator
    判断提供的子串是否出现在table的value中。比如:substring:great

scan例子

查询方式通过rowKey来进行查询是最快的,所以rowkey的设计一定要合理,如果不合理会很影响查询速率。但是有时候确实没有办法完全通过rowkey来查询,所以就要借助scan.
scan命令支持的修饰词除了列(COLUMNS)修饰词外,HBase还支持Limit(限制查询结果行数),STARTROW(ROWKEY起始行。会先根据这个key定位到region,再向后扫描)、STOPROW(结束行)、TIMERANGE(限定时间戳范围)、VERSIONS(版本数)、和FILTER(按条件过滤行)等

  1. 查询user是zhangsan的用户的评论数据,最多只返回10条
    scan 'zy_comment',{LIMIT=>10,FILTER=>"PrefixFilter('zhangsan')"}

  1. 通过startrow,stoprow来进行查询(这种也比较快,实际操作中如果不能通过rowkey)
    scan 'zy_comment',{STARTROW=>'b',STOPROW='e',LIMIT=>10}

  2. 查询评论内容为666的评论有哪些
    scan 'zy_comment',{LIMIT=>10,FILTER=>"ValueFilter(=,'substring:666')"}

  1. 查询热点文章的数据有哪些
scan 'zy_comment',{LIMIT=>10,FILTER="SingleColumnValueFilter('info','articleType',=,'binary: \x00\x00\x00\x00\x00\x00\x00\x02')"}

这里binary中的数据一定要是二进制字符串而不是具体的值

  1. 查看评论包含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'))"}

  1. 查询评论的前两条
    scan 'zy_comment',{FILTER=>"PageFilter(2)"}和LIMIT有异曲同工之妙

  1. 查询rowkey中包含特定前缀的数据
    scan 'zy_comment',{FILTER=>"RowFilter(=,'substring:zhangsan')"}

  1. 使用全限定名称查询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命令详解相关推荐

  1. Linux的scan命令,clamscan-Linux查毒工具的命令详解

    clamscan-Linux查毒工具的命令详解 clamscan命令用于扫描文件和目录,一发现其中包含的计算机病毒,clamscan命令除了扫描linux系统的病毒外,主要扫描的还是文件中包含的win ...

  2. net user命令详解

    net use \\ip\ipc$ " " /user:" " 建立IPC空链接  net use \\ip\ipc$ "密码" /user ...

  3. Redis命令详解:Hashs

    Hash是一种String类型的field.value的映射表,因此,它非常适合存储对象.下面我们来一一介绍与Hash相关的命令. HDEL 最早可用版本:2.0.0 时间复杂度:O(N),其中N为要 ...

  4. Linux 学习之路 (三):用户管理命令详解

    用户管理命令详解 useradd [options] USERNAME ​ -u UID(>=500,并且与其他用户无重复) ​ -g GID(基本组,组必须事先存在) ​ -G GID,- ( ...

  5. 网络安全nmap扫描端口命令详解linux网络探测

    简介: nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端.确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting).它是网络管理员必用的 ...

  6. Linux常用命令详解(最全)

    Linux命令目录 Linux命令集合 系统信息 关机 (系统的关机.重启以及登出 ) 文件和目录 文件搜索 挂载一个文件系统 磁盘空间 用户和群组 文件的权限 - 使用 "+" ...

  7. Nmap命令详解及常用命令总结

    Nmap学习 文章目录 Nmap学习 0 Nmap 介绍 1 Nmap命令详解 1.1 Nmap 命令help详解(内附中文翻译) 1.2 Nmap 命令思维导图 2 Nmap 常见使用场景以及相关命 ...

  8. md0和md1linux软raid,linux下Raid及mdadm命令详解

    linux下Raid及mdadm命令详解 1.RAID级别:仅代表磁盘组织方式不同,没有高低之分: Raid常用种类:raid0,raid1,raid5,raid10,raid01 jbod:叠加硬盘 ...

  9. MySQL调试--explain命令详解

    原文网址:MySQL调试--explain命令详解_IT利刃出鞘的博客-CSDN博客 简介 本文介绍MySQL的explain命令的用法及其结果的含义. explain作用 概述 在 SELECT 语 ...

最新文章

  1. SharePoint迁移和升级方案
  2. [shell]简单的shell提示和参数脚本
  3. NFS企业级网络文件共享
  4. FPGA中状态机的稳定性
  5. ftp上传和下载命令
  6. Spring : lombok : 注解@Slf4j
  7. Visual Studio 201~ Code 格式检查
  8. java定时每周执行一次_Spring 定时任务如何实现每周一某个时间执行?
  9. Android矢量绘图
  10. webview 边距_张虹亮'blog » android中的dialog默认离屏幕的边距如何去除(即如何全屏)...
  11. 北大计算机山西,2019年山西省清华、北大录取人数及招生情况整理汇总
  12. 拼多多——多多的字符变换
  13. python mongodb分页查询_python数据库分页查询语句
  14. 联想计算机不能进入系统桌面,win10电脑开机后进不了系统桌面只有联想logo
  15. JavaScript 内存溢出,内存泄漏
  16. 模电——磁珠的前世今生
  17. win10 如何开启guest
  18. Pillar-based Object Detection for Autonomous Driving(基于柱体的自动驾驶目标检测)论文笔记
  19. 解读最佳实践:倚天710 ARM芯片的 Python+AI 算力优化
  20. 蓝桥杯 BASIC-3 字母图形**

热门文章

  1. 利用CVX使用ADMM算法的注意点
  2. vscode前端环境(html+css+javascript)的配置
  3. 导线截面积和电流的关系
  4. ASCII码、Unicode编码对照表 —— ASCII控制字符 Unicode编码 字符编码的前世此生
  5. “早安、午安、晚安” Game Jam
  6. Acrobat_8_Pro_SC 激活老是提示你输入的授权码无效
  7. PX4装机教程(八)常用硬件
  8. Elastic-job实现分布式定时任务
  9. 算法精解一(C语言版)
  10. 广告素材优选算法在内容营销中的应用实践