hbase SingleColumnValueFilter 列不存在 无法过滤

问题描述

对一张log表按时间过滤

正常数据的话,每行有一个时间戳列timestamp作为操作时间,按这个列值过滤出特定时间段的log信息

但是不知怎么的log表中多了一些垃圾数据(不一定是垃圾数据,只是没有timestamp这个字段)。

过滤第一天的话会有5800条没有操作时间(timestamp),

过滤第二天的时候还是有5800条没有操作时间的,

过滤前两天的时候还是5800条。

问题分析

问题很明显了,就是当某一行没有要过滤的字段时,SingleColumnValueFilter是默认这一行符合过滤条件的。

接下来就要让SingleColumnValueFilter在判断的时候把这个策略改改。

查看源码发现是有方法可以更改这个策略的

代码展现

在SingleColumnValueFilter的源码开头的一段注释中(加粗加大的位置)说明了方法

/**
 * This filter is used to filter cells based on value. It takes a {@link CompareFilter.CompareOp}
 * operator (equal, greater, not equal, etc), and either a byte [] value or
 * a ByteArrayComparable.
 * <p>
 * If we have a byte [] value then we just do a lexicographic compare. For
 * example, if passed value is ‘b‘ and cell has ‘a‘ and the compare operator
 * is LESS, then we will filter out this cell (return true).  If this is not
 * sufficient (eg you want to deserialize a long and then compare it to a fixed
 * long value), then you can pass in your own comparator instead.
 * <p>
 * You must also specify a family and qualifier.  Only the value of this column
 * will be tested. When using this filter on a {@link Scan} with specified
 * inputs, the column to be tested should also be added as input (otherwise
 * the filter will regard the column as missing).
 * <p>
 * To prevent the entire row from being emitted if the column is not found
 * on a row, use {@link #setFilterIfMissing}.
 * Otherwise, if the column is found, the entire row will be emitted only if
 * the value passes.  If the value fails, the row will be filtered out.
 * <p>
 * In order to test values of previous versions (timestamps), set
 * {@link #setLatestVersionOnly} to false. The default is true, meaning that
 * only the latest version‘s value is tested and all previous versions are ignored.
 * <p>
 * To filter based on the value of all scanned columns, use {@link ValueFilter}.
 */

更改代码

SingleColumnValueFilter f1 = new SingleColumnValueFilter(Bytes.toBytes(FAMILY), Bytes.toBytes("timestamp"), CompareOp.GREATER_OR_EQUAL, Bytes.toBytes(starttime));
SingleColumnValueFilter f2 = new SingleColumnValueFilter(Bytes.toBytes(FAMILY), Bytes.toBytes("timestamp"), CompareOp.LESS, Bytes.toBytes(endtime));
f1.setFilterIfMissing(true);  //true 跳过改行;false 通过该行
f2.setFilterIfMissing(true);
filters.add(f1);
filters.add(f2);

反思

一开始打算继承出一个新类,然后重写部分方法,不过好像还是这样更灵活一些

时间: 2024-12-20 16:48:04

hbase SingleColumnValueFilter 列不存在 无法过滤的相关文章

HBase与列存储

传统的行存储和(HBase)列存储的区别 1.为什么要按列存储 列式存储(Columnar or column-based)是相对于传统关系型数据库的行式存储(Row-basedstorage)来说的.简单来说两者的区别就是如何组织表: ?  Row-based storage stores atable in a sequence of rows. ?  Column-based storage storesa table in a sequence of columns. 行式存储下一张表的

HBase 是列式存储数据库吗

在介绍 HBase 是不是列式存储数据库之前,我们先来了解一下什么是行式数据库和列式数据库. 行式数据库和列式数据库 在维基百科里面,对行式数据库和列式数据库的定义为:列式数据库是以列相关存储架构进行数据存储的数据库,主要适合于批量数据处理(OLAP)和即时查询.相对应的是行式数据库,数据以行相关的存储体系架构进行空间分配,主要适合于小批量的数据处理,常用于联机事务型数据处理(OLTP). 比如我们有以下的表格: 那么行式数据库和列式数据库存储模型分别如上面的左图和右图.可以看到,行式数据一行的

《Entity Framework 6 Recipes》中文翻译系列 (15) -----第三章 查询之与列表值比较和过滤关联实体

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-8与列表值比较 问题 你想查询一个实体,条件是给定的列表中包含指定属性的值. 解决方案 假设你有如图3-9所示的模型. 图3-9 包含books和它的categoryes的模型 你想查找给定目录列表中的所有图书.在代码清单3-16中使用LINQ和Entity SQL来实现这上功能. 代理清单3-16. 使用LINQ和Entity SQL来查找给定目录列表中的所有图书 1 using (v

hive on hbase中列族的列名不固定

问题:列族中列名的数量不固定,随时变化 问题分析: 这种情况,在hive中提前做好映射是不可能的: 解决:可以用hive中的map映射 案例: hbase中建表: create 'user_profile','cf' hive建表: CREATE EXTERNAL TABLE user_profile ( username STRING, labels map<string, string> ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStor

Java链接HBASE数据库,创建一个表,删除一张表,修改表,输出插入,修改,数据删除,数据获取,显示表信息,过滤查询,分页查询,地理hash

准备工作 1.创建Java的Maven项目 创建好的目录结构如下:  另外注意junit的版本,最好不要太高,最开始笔者使用的junit4.12的,发现运行的时候会报错.最后把Junit的版本改成4.7的之后,问题解决了. 创建测试工具类HbaseDemo,为了保证能够让Hbase运行,需要最开始写出如下配置: package toto.com.hbase; import java.util.ArrayList; import java.util.Iterator; import org.apa

hbase 基本的JavaApi 数据操作及过滤

本文主要是hbase的表操作.数据操作.数据查询过滤等,如果对JDBC或ADO有了解,容易理解HBASE API. hbase版本是2.0. 1.为了方便先贴helper的部分代码(文末git上有完整的测试代码),主要是为了复用Connection. public class HBaseHelper implements Closeable { private Configuration configuration = null; private Connection connection =

并发拉取HBase大量指定列数据时卡住的问题排查

最近遇到一例,并发拉取HBase大量指定列数据时,导致应用不响应的情形.记录一下. 背景 退款导出中,为了获取商品规格编码,需要从HBase表 T 里拉取对应的数据. T 对商品数据的存储采用了 表名:字段名:id 的列存储方式.由于这个表很大,且为详情公用,因此不方便使用 scan 的方式,担心带来集群的不稳定,进而影响详情和导出的整体稳定性. 要用 multiGet 的方式来获取多个订单的这个列的数据. 就必须动态生成相应的列,然后在 HBase 获取数据的时候指定列集合. 现有记录集合 L

HBase基础知识,面向列的实时分布式数据库

Hbase是运行在Hadoop上的NoSQL数据库,它是一个分布式的和可扩展的大数据仓库,也就是说HBase能够利用HDFS的分布式处理模式,并从Hadoop的MapReduce程序模型中获益. 1.HBase定义 HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”.就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之

HBase底层存储原理——我靠,和cassandra本质上没有区别啊!都是kv 列存储,只是一个是p2p另一个是集中式而已!

理解HBase(一个开源的Google的BigTable实际应用)最大的困难是HBase的数据结构概念究竟是什么?首先HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式. Google's BigTable论文 清楚地解释了什么是BigTable: Bigtable是一个疏松的分布式的持久的多维排序的map,这个map被行键,列键,和时间戳索引.每一个值都是连续的byte数组.(A Bigtable is a sparse