数据总数:746条数据

因为后面需要进行算法合成,而且spark目前对这种算法支持并不好,因此采用代码编写,所以在查询hbase的过程中采用的是java直接查询,

但是为了加快查询速度,我尽可能的使用了过滤器

1:初期Hbase的rowkey组合:时间+"_"+订单id

查询思路:

1:能快速检索,减少GC,采用过滤器

2:支持时间段查询

根据上面两点,我采用时间过滤,比如:startTime=201904010000  endTime=201904180000|;【注意这个符号:“|” 】然后根据行键过滤器

CompareFilter.CompareOp.GREATER_OR_EQUAL和
CompareFilter.CompareOp.LESS_OR_EQUAL进行大小对比

使用代码在查询的时候,添加了行键过滤器

 FilterList filterList=new FilterList();
//time+id
if(startTime != null){
RowFilter rf = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,
new BinaryComparator(Bytes.toBytes(startTime)));
filterList.addFilter(rf);
}
if(endTime != null){
RowFilter rf = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,
new BinaryComparator(Bytes.toBytes(endTime)));
filterList.addFilter(rf);
}
scan.setFilter(filterList);

完整代码:

 /**
* 行键过滤器
* */
public static List<Map<String , String>> rowFilter(String tableName , String startTime , String endTime){
Connection connection = null;
Scan scan = new Scan();
scan.setCacheBlocks(false);
ResultScanner rs = null;
Table table = null;
List<Map<String , String>> list = new ArrayList<Map<String , String>>();
try{
connection = ConnectionFactory.createConnection(config);
table = connection.getTable(TableName.valueOf(tableName));
FilterList filterList=new FilterList();
//time+id
if(startTime != null){
RowFilter rf = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,
new BinaryComparator(Bytes.toBytes(startTime)));
filterList.addFilter(rf);
}
if(endTime != null){
RowFilter rf = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,
new BinaryComparator(Bytes.toBytes(endTime)));
filterList.addFilter(rf);
}
scan.setFilter(filterList);
rs = table.getScanner(scan);
for (Result r : rs) {
Map<String , String> map = new HashMap<String , String>();
for (Cell cell : r.listCells()) {
map.put(Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength())
, Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
}
list.add(map);
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (null != rs) {
rs.close();
}
try {
if (null != table) {
table.close();
}
if (null != connection && !connection.isClosed()) {
System.out.println("scan Result is closed");
connection.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return list; }

初期完整代码

那么这种方案查询后返回的结果是:361条数据! 实际Hbase测试表中有746条数据,那么可以肯定,是行键过滤器出错了(后面再研究为啥出错)

改善:

更改rowkey结构,采用:订单id+"_"+time来实现

然后过滤器代码改善:

 FilterList filterList=new FilterList();
//id+time
if(startTime != null){
RowFilter rf = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,
new RegexStringComparator(".*_"+startTime));
filterList.addFilter(rf);
}
if(endTime != null){
RowFilter rf = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,
new RegexStringComparator(".*_"+endTime));
filterList.addFilter(rf);
}
scan.setFilter(filterList);

上面其实就是采用正则表达式进行后缀识别,这样我就可以根据后缀进行时间过滤

完整代码:

    /**
* 行键过滤器
* */
public static List<Map<String , String>> rowEndFilter(String tableName , String startTime , String endTime){
Connection connection = null;
Scan scan = new Scan();
scan.setCacheBlocks(false);
ResultScanner rs = null;
Table table = null;
List<Map<String , String>> list = new ArrayList<Map<String , String>>();
try{
connection = ConnectionFactory.createConnection(config);
table = connection.getTable(TableName.valueOf(tableName));
FilterList filterList=new FilterList();
//id+time
if(startTime != null){
RowFilter rf = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,
new RegexStringComparator(".*_"+startTime));
filterList.addFilter(rf);
}
if(endTime != null){
RowFilter rf = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,
new RegexStringComparator(".*_"+endTime));
filterList.addFilter(rf);
}
scan.setFilter(filterList);
rs = table.getScanner(scan);
for (Result r : rs) {
Map<String , String> map = new HashMap<String , String>();
for (Cell cell : r.listCells()) {
map.put(Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength())
, Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
}
list.add(map);
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (null != rs) {
rs.close();
}
try {
if (null != table) {
table.close();
}
if (null != connection && !connection.isClosed()) {
System.out.println("scan Result is closed");
connection.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return list; }

上面就会查询出完整数据。

记一次Hbase的行键过滤器事故问题的更多相关文章

  1. HBase按照行键范围删除数据

    #!/bin/bash #TOOL_PATH=$(cd "$(dirname "$0")"; pwd) #TOOL_PATH_TMP=$(cd "$( ...

  2. Hadoop-No.7之行键

    和哈希表类比,HBase中的行键类似于哈希表中的键.要构造一个良好的HBase模式,关键之一就是选择一个合适的行键. 1 记录检索 行键是HBase中检索记录所使用的键.HBase记录含有的列在数量上 ...

  3. HBase应用开发回顾与总结系列之二:RowKey行键设计规范

    2. RowKey行键设计规范 2.1. RowKey四大特性 2.1.1 字符串类型 虽然行键在HBase中是以byte[]字节数组的形式存储的,但是建议在系统开发过程中将其数据类型设置为Strin ...

  4. Hadoop HBase概念学习系列之优秀行键设计(十六)

    我们通过行键访问HBase.尽管使用扫描过滤器可以一次性指明大量的键,但是HBase仅仅能够根据行键识别出一行. 优秀的行键设计可以保证良好的HBase性能. 1.行键存在于HBase中的每一个单元格 ...

  5. HBase应用开发回顾与总结系列之三:RowKey行键生成器工具

      所谓RowKey行键生成器,是指通过软件工具制定行键生成策略,并可将策略信息保存成本地策略文件,待需要时再将本地策略文件序列化成行键生成策略对象,传入数据行信息后可自动生成RowKey行键. 那么 ...

  6. Hadoop HBase概念学习系列之行、行键(十一)

    行是由列簇中的列组成.行根据行键依照字典顺序排序. HBase的行使用行键标识,可以使用行键查询整行的数据. 对同一个行键的访问都会落在同样的物理节点上.如果表包含2个列簇,属于两个列簇的文件还是保存 ...

  7. HBase行键的设计

    rowkey是行的主键,而且hbase只能用rowkey范围即scan来查找数据.rowkey是以字典排序的.可以巧妙设计行键,比如想通过电影的评价进行排序,可以把评分rate和电影id组合起来,ra ...

  8. 架构师必备:HBase行键设计与应用

    首先要回答一个问题,为何要使用HBase? 随着业务不断发展.数据量不断增大,MySQL数据库存在这些问题: MySQL支持的数据量为TB级,不能一直保留历史数据.而HBase支持的数据量为PB级,适 ...

  9. Hbase rowkey设计+布隆过滤器+STORE FILE & HFILE结构

    Rowkey设计 Rowkey设计原则 Rowkey设计应遵循以下原则: 1.Rowkey的唯一原则 必须在设计上保证其唯一性.由于在HBase中数据存储是Key-Value形式,若HBase中同一表 ...

随机推荐

  1. ansible-playbook用法

    一.playbook用法 1.playbook的执行文件为YAML语言编写,所以文件名为xxx.yml.YAML语法可以参考https://docs.ansible.com/ansible/lates ...

  2. 重装系统windows10/8/7,绝对纯净版永久激活的详细步骤和固态硬盘找不到分区的原因

    简介:重装系统有两种: 一种是在线重装,可实现电脑双系统或多系统,也可单系统(重装在另外一个盘,再去格式化系统盘),这种方式比较麻烦,前提电脑能开机使用,但是一般能启动使用也没人去重装系统,但是不需要 ...

  3. STL迭代器iterator

    一:迭代器原理 迭代器是一个“可遍历STL容器内全部或部分元素”的对象. 迭代器指出容器中的一个特定位置. 迭代器就如同一个指针. 迭代器提供对一个容器中的对象的访问方法,并且可以定义了容器中对象的范 ...

  4. 关于4A系统(我对4A系统的维护的理解)

    4A系统 4A系统是统一安全管理平台解决方案,指认证Authentication.账号Account.授权Authorization.审计Audit,中文名称为统一安全管理平台解决方案.即将身份认证. ...

  5. 34 springboot项目之间依赖导致bean 无法加载问题

    方式一(OK) 模块A引入模块B ,但是模块B的bean一直注入不进来 原因: A模块的Application是在com.xx.xx包下,那么势必只能扫描到这个包下的bean, B模块的Applica ...

  6. 【转】关于Tomcat下项目线程启动两次的问题

    最近遇见了一个很搞得事情,在tomcat下启动项目时自己写的定时程序被执行了两次,导致程序启动了两个线程,使定时任务在几秒间隔内执行了两次,后来通过日志查到,原来是tomcat将项目启动了两次,为什么 ...

  7. echarts笔记

    常见问题: 1.x轴和y轴type同时为category时不可行 只能改变方式显示,返回不同名称,如加上百分比显示 formatter:"value%"; var waterLev ...

  8. windows下搭建Kafka,并通过命令窗口收发消息

    参考网址: https://blog.csdn.net/ydc321/article/details/70154278 前提条件:windows环境需要安装jdk 1.下载Kafka,可以通过官网下载 ...

  9. Django unittest 单元测试

    这里就不再介绍单元测试的作用了. 首先单元测试的创建方式有两种,一种是app下面的test文件,另一种是自定义方式创建 方法一.使用test.py文件测试 from django.test impor ...

  10. 风火轮SMC532使用

    2018年3月份申请了一个院创,要做一个基于NFC技术的考勤设备,想法是用手机的NFC将学号信息传导考勤机,由考勤机统计缺勤信息,因为自己的拖延症,一直拖到现在.现在一边写毕业论文一边准备院创答辩,又 ...