0.0 看hbase shell命令行下结果:
ROW COLUMN+CELL 1 column=base:age, timestamp=1456557395891, value=31 1 column=base:name, timestamp=1456557377874, value=zm 2 column=base:age, timestamp=1456554268023, value=1 2 column=base:name, timestamp=1456554268023, value=baobao 3 column=base:age, timestamp=1456398168279, value=1 3 column=base:name, timestamp=1456542759628, value=houhou 3 row(s) in 0.5190 seconds
上述数据 hbase逻辑存储结构为:
如果 通过 scan循环上述表的话,那么真实中会有6行数据,并会循环六次。
0 前言:
hbase为筛选数据提供了一组过滤器,这样可以在hbase的多个维度(行,列,数据版本)上进行数据筛选,
通常使用 行健 , 值来筛选数据的应用场景较多。
1 rowfilter: 筛选出行健匹配到的所有行
Filter rf = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("row1"))); // OK 筛选出匹配的所有的行
针对0.0的数据,下列代码和展示结果:
try { HBaseAdmin hBaseAdmin = new HBaseAdmin(conf); HTable htable = new HTable(conf, "stu"); Scan scan = new Scan(); // RowFilter是根据rowkey来过滤,下面是来过滤 rowkey只是非零的正整数的 Filter filter = new RowFilter(CompareOp.EQUAL, new RegexStringComparator("^\\+?[1-9][0-9]*$")); scan.setFilter(filter); // 增加过滤器 ResultScanner resultScanner = htable.getScanner(scan); for(Result result : resultScanner){ //result: HBase cell defined by the row, family, qualifier, timestamp, and value /*String rowKey = new String(result.getRow()); System.out.println(rowKey);*/ if(result.raw().length==0){ System.out.println("使用正则过滤stu 表数据为空"); }else{ //在hbase中为6行,最后结果会循环着6行然后将这6行每一列打印出来 for(KeyValue kv : result.raw()){ // 得到组成result的各个单元cell, 这些cell是由row, family, qualifier,value等组成 System.out.println(Bytes.toString(kv.getRow())); System.out.println(Bytes.toString(kv.getFamily())); System.out.println(Bytes.toString(kv.getQualifier())); System.out.println(Bytes.toString(kv.getValue())); } } } } catch (Exception e) { e.printStackTrace(); }
2 PrefixFilter:筛选出具有特定前缀的行键的数据。这个过滤器所实现的功能其实也可以由RowFilter结合RegexComparator来实现,不过这里提供了一种简便的使用方法,以下过滤器就是筛选出行键以row为前缀的所有的行:
- Filter pf = new PrefixFilter(Bytes.toBytes("row")); // OK 筛选匹配行键的前缀成功的行
3 KeyOnlyFilter:这个过滤器唯一的功能就是只返回每行的行键,值全部为空,这对于只关注于行键的应用场景来说非常合适,这样忽略掉其值就可以减少传递到客户端的数据量,能起到一定的优化作用:
- Filter kof = new KeyOnlyFilter(); // OK 返回所有的行,但值全是空
4 RandomRowFilter:从名字上就可以看出其大概的用法,本过滤器的作用就是按照一定的几率(<=0会过滤掉所有的行,>=1会包含所有的行)来返回随机的结果集,对于同样的数据集,多次使用同一个RandomRowFilter会返回不通的结果集,对于需要随机抽取一部分数据的应用场景,可以使用此过滤器:
- Filter rrf = new RandomRowFilter((float) 0.8); // OK 随机选出一部分的行
5 5. InclusiveStopFilter:扫描的时候,我们可以设置一个开始行键和一个终止行键,默认情况下,这个行键的返回是前闭后开区间,即包含起始行,单不包含中指行,如果我们想要同时包含起始行和终止行,那么我们可以使用此过滤器:
- Filter isf = new InclusiveStopFilter(Bytes.toBytes("row1")); // OK 包含了扫描的上限在结果之内
6. FirstKeyOnlyFilter:如果你只想返回的结果集中只包含第一列的数据,那么这个过滤器能够满足你的要求。它在找到每行的第一列之后会停止扫描,从而使扫描的性能也得到了一定的提升:
- Filter fkof = new FirstKeyOnlyFilter(); // OK 筛选出第一个每个第一个单元格
7. ColumnPrefixFilter:顾名思义,它是按照列名的前缀来筛选单元格的,如果我们想要对返回的列的前缀加以限制的话,可以使用这个过滤器:
- Filter cpf = new ColumnPrefixFilter(Bytes.toBytes("qual1")); // OK 筛选出前缀匹配的列
8. ValueFilter:按照具体的值来筛选单元格的过滤器,这会把一行中值不能满足的单元格过滤掉,如下面的构造器,对于每一行的一个列,如果其对应的值不包含ROW2_QUAL1,那么这个列就不会返回给客户端:
- Filter vf = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("ROW2_QUAL1")); // OK 筛选某个(值的条件满足的)特定的单元格
9. ColumnCountGetFilter:这个过滤器来返回每行最多返回多少列,并在遇到一行的列数超过我们所设置的限制值的时候,结束扫描操作:
- Filter ccf = new ColumnCountGetFilter(2); // OK 如果突然发现一行中的列数超过设定的最大值时,整个扫描操作会停止
10. SingleColumnValueFilter:用一列的值决定这一行的数据是否被过滤。在它的具体对象上,可以调用setFilterIfMissing(true)或者setFilterIfMissing(false),默认的值是false,其作用是,对于咱们要使用作为条件的列,如果这一列本身就不存在,那么如果为true,这样的行将会被过滤掉,如果为false,这样的行会包含在结果集中。
- SingleColumnValueFilter scvf = new SingleColumnValueFilter(
- Bytes.toBytes("colfam1"),
- Bytes.toBytes("qual2"),
- CompareFilter.CompareOp.NOT_EQUAL,
- new SubstringComparator("BOGUS"));
- scvf.setFilterIfMissing(false);
- scvf.setLatestVersionOnly(true); // OK
11. SingleColumnValueExcludeFilter:这个与10种的过滤器唯一的区别就是,作为筛选条件的列的不会包含在返回的结果中。
12. SkipFilter:这是一种附加过滤器,其与ValueFilter结合使用,如果发现一行中的某一列不符合条件,那么整行就会被过滤掉:
- Filter skf = new SkipFilter(vf); // OK 发现某一行中的一列需要过滤时,整个行就会被过滤掉
13. WhileMatchFilter:这个过滤器的应用场景也很简单,如果你想要在遇到某种条件数据之前的数据时,就可以使用这个过滤器;当遇到不符合设定条件的数据的时候,整个扫描也就结束了:
- Filter wmf = new WhileMatchFilter(rf); // OK 类似于Python itertools中的takewhile
14. FilterList:用于综合使用多个过滤器。其有两种关系:FilterList.Operator.MUST_PASS_ONE和FilterList.Operator.MUST_PASS_ALL,默认的是FilterList.Operator.MUST_PASS_ALL,顾名思义,它们分别是AND和OR的关系,并且FilterList可以嵌套使用FilterList,使我们能够表达更多的需求:
- List<Filter> filters = new ArrayList<Filter>();
- filters.add(rf);
- filters.add(vf);
- FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters); // OK 综合使用多个过滤器, AND 和 OR 两种关系
以下代码是数据写入代码:
:
以下是过滤器测试代码,可以通过修改代码,更换过滤器来看到具体的效果:
- package com.reyun.hbase;
- import java.io.IOException;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.hbase.HBaseConfiguration;
- import org.apache.hadoop.hbase.client.HTable;
- import org.apache.hadoop.hbase.client.Put;
- import org.apache.hadoop.hbase.util.Bytes;
- public class HBaseDataFeeding {
- private final static byte[] ROW1 = Bytes.toBytes("row1");
- private final static byte[] ROW2 = Bytes.toBytes("row2");
- private final static byte[] COLFAM1 = Bytes.toBytes("colfam1");
- private final static byte[] COLFAM2 = Bytes.toBytes("colfam2");
- private final static byte[] QUAL1 = Bytes.toBytes("qual1");
- private final static byte[] QUAL2 = Bytes.toBytes("qual2");
- public static void main(String[] args) throws IOException {
- Configuration conf = HBaseConfiguration.create();
- HTable table = new HTable(conf, "testtable");
- table.setAutoFlushTo(false);
- Put put_row1 = new Put(ROW1);
- put_row1.add(COLFAM1, QUAL1, Bytes.toBytes("ROW1_QUAL1_VAL"));
- put_row1.add(COLFAM1, QUAL2, Bytes.toBytes("ROW1_QUAL2_VAL"));
- Put put_row2 = new Put(ROW2);
- put_row2.add(COLFAM1, QUAL1, Bytes.toBytes("ROW2_QUAL1_VAL"));
- put_row2.add(COLFAM1, QUAL2, Bytes.toBytes("ROW2_QUAL2_VAL"));
- try{
- table.put(put_row1);
- table.put(put_row2);
- }finally{
- table.close();
- }
- }
- }
以下是过滤器测试代码,可以通过修改代码,更换过滤器来看到具体的效果:
- package com.reyun.hbase;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.hbase.Cell;
- import org.apache.hadoop.hbase.CellUtil;
- import org.apache.hadoop.hbase.HBaseConfiguration;
- import org.apache.hadoop.hbase.client.HTable;
- import org.apache.hadoop.hbase.client.Result;
- import org.apache.hadoop.hbase.client.ResultScanner;
- import org.apache.hadoop.hbase.client.Scan;
- import org.apache.hadoop.hbase.filter.BinaryComparator;
- import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;
- import org.apache.hadoop.hbase.filter.ColumnPrefixFilter;
- import org.apache.hadoop.hbase.filter.CompareFilter;
- import org.apache.hadoop.hbase.filter.Filter;
- import org.apache.hadoop.hbase.filter.FilterList;
- import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter;
- import org.apache.hadoop.hbase.filter.InclusiveStopFilter;
- import org.apache.hadoop.hbase.filter.KeyOnlyFilter;
- import org.apache.hadoop.hbase.filter.PageFilter;
- import org.apache.hadoop.hbase.filter.PrefixFilter;
- import org.apache.hadoop.hbase.filter.RandomRowFilter;
- import org.apache.hadoop.hbase.filter.RowFilter;
- import org.apache.hadoop.hbase.filter.SkipFilter;
- import org.apache.hadoop.hbase.filter.ValueFilter;
- import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
- import org.apache.hadoop.hbase.filter.SubstringComparator;
- import org.apache.hadoop.hbase.filter.WhileMatchFilter;
- import org.apache.hadoop.hbase.util.Bytes;
- public class HBaseScannerTest {
- public static void main(String[] args) throws IOException, IllegalAccessException {
- Configuration conf = HBaseConfiguration.create();
- HTable table = new HTable(conf, "testtable");
- table.setAutoFlushTo(false);
- Scan scan1 = new Scan();
- SingleColumnValueFilter scvf = new SingleColumnValueFilter(
- Bytes.toBytes("colfam1"),
- Bytes.toBytes("qual2"),
- CompareFilter.CompareOp.NOT_EQUAL,
- new SubstringComparator("BOGUS"));
- scvf.setFilterIfMissing(false);
- scvf.setLatestVersionOnly(true); // OK
- Filter ccf = new ColumnCountGetFilter(2); // OK 如果突然发现一行中的列数超过设定的最大值时,整个扫描操作会停止
- Filter vf = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("ROW2_QUAL1")); // OK 筛选某个(值的条件满足的)特定的单元格
- Filter cpf = new ColumnPrefixFilter(Bytes.toBytes("qual2")); // OK 筛选出前缀匹配的列
- Filter fkof = new FirstKeyOnlyFilter(); // OK 筛选出第一个每个第一个单元格
- Filter isf = new InclusiveStopFilter(Bytes.toBytes("row1")); // OK 包含了扫描的上限在结果之内
- Filter rrf = new RandomRowFilter((float) 0.8); // OK 随机选出一部分的行
- Filter kof = new KeyOnlyFilter(); // OK 返回所有的行,但值全是空
- Filter pf = new PrefixFilter(Bytes.toBytes("row")); // OK 筛选匹配行键的前缀成功的行
- Filter rf = new RowFilter(CompareFilter.CompareOp.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("row1"))); // OK 筛选出匹配的所有的行
- Filter wmf = new WhileMatchFilter(rf); // OK 类似于Python itertools中的takewhile
- Filter skf = new SkipFilter(vf); // OK 发现某一行中的一列需要过滤时,整个行就会被过滤掉
- List<Filter> filters = new ArrayList<Filter>();
- filters.add(rf);
- filters.add(vf);
- FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters); // OK 综合使用多个过滤器, AND 和 OR 两种关系
- scan1.
- setStartRow(Bytes.toBytes("row1")).
- setStopRow(Bytes.toBytes("row3")).
- setFilter(scvf);
- ResultScanner scanner1 = table.getScanner(scan1);
- for(Result res : scanner1){
- for(Cell cell : res.rawCells()){
- System.out.println("KV: " + cell + ", Value: " + Bytes.toString(CellUtil.cloneValue(cell)));
- }
- System.out.println("------------------------------------------------------------");
- }
- scanner1.close();
- table.close();
- }
- }
相关推荐
HBase是一种开源的非关系型分布式...需要注意的是,实验手册中提供的命令格式和使用说明是非常基础的入门指引,对于深入应用HBase来说,掌握高级的Filter使用、时间戳和版本控制、以及数据批量导入方法将更为关键。
Hbase 提供了高性能、可扩展性和高可用性的数据存储解决方案。 二、Java 操作 Hbase ### 1. 搭建环境 要使用 Java 操作 Hbase,首先需要搭建环境。新建一个 Java 项目,然后添加相关的 jar 包,包括 hadoop-core-...
实验旨在让参与者熟练掌握HBase的Shell操作,包括创建表、输入数据以及进行特定查询。以下是详细步骤及知识点解析: ### 1. HBase Shell基础 HBase Shell是HBase提供的命令行界面,用户可以通过它来与HBase集群...
在HBase中,数据读取流程相对复杂,尤其是Scan查询,这是由于其独特的数据存储和更新机制。本文将深入探讨HBase的Scan查询流程。 HBase的存储引擎基于LSM-Like树,这使得一次范围查询可能涉及到多个Region(分片)...
HBase是Apache Hadoop生态系统中的一个分布式、版本化、列族式存储系统,设计用于处理大规模数据集。这个“hbase-2.4.17-bin”安装包提供了HBase的最新稳定版本2.4.17,适用于大数据处理和分析场景。下面将详细介绍...
5. **过滤器和比较器**:通过使用`Filter`接口,开发者可以实现复杂的数据筛选逻辑,如基于特定条件的查询。同时,`Comparator`接口允许自定义列值的比较规则。 6. **安全性与权限**:Java-HBase开发包也支持HBase...
HBase支持多种查询方式,如Get、Scan和Filter,这些工具可以帮助开发者实现复杂的数据检索逻辑。同时,理解如何根据业务需求调整HBase配置,以及如何处理数据热点问题,是提高系统性能的关键。 总之,《HBase:权威...
这意味着HBase的数据是跨多台服务器分布式存储的,提供了高可用性和容错性。HBase的数据模型基于BigTable的设计,以行和列来进行数据组织,每个表被分为多个行,行由行键(Row Key)标识,而每一行又包含多个列族...
在分布式大数据处理领域,HBase是一个非常重要的列式存储数据库,尤其在处理海量实时数据时表现出色。HBase是构建在Hadoop文件系统(HDFS)之上的,它提供了高度可扩展性和高并发读写能力。为了在Hadoop项目中使用...
在实际应用中,可能会涉及到更复杂的查询场景,如使用Filter进行数据筛选,或者利用HBase的Region Split特性优化存储和查询性能。对于过滤器,可以创建各种类型的Filter对象,如`PrefixFilter`、`RowFilter`等,并将...
可以利用布隆过滤器(Bloom Filter)减少无效的磁盘I/O,以及Scan操作来批量获取数据。 7. **HBase与Hadoop集成**:HBase构建在Hadoop的HDFS之上,利用HDFS的分布式存储特性。MapReduce可以用于对HBase进行批量操作...
- **功能**: 显示HBase集群的状态信息,包括活动Master节点以及RegionServer的状态。 - **示例**: ```shell hbase(main):002:0> status { "cluster" : "test-cluster", "timestamp" : 1649309921757, "master" ...
在大数据处理领域,HBase作为一个分布式列式存储系统,因其高效的数据存储和查询能力而备受青睐。然而,随着数据量的增长,如何进行有效的性能优化变得至关重要。本文将深入探讨HBase性能优化的各种策略,旨在帮助你...
根据提供的文件信息,本文将详细介绍HBase的Shell操作及其应用场景,包括如何创建表、插入数据、查询数据等关键操作。 ### HBase Shell简介 HBase Shell是HBase提供的一种交互式命令行工具,用于执行HBase操作。它...
HBase的设计目标是为了处理大规模的数据存储和快速随机访问。 1. **HBase表结构**: HBase的表由行(Row)和列(Column)组成,但不同于传统的关系型数据库,列在HBase中被组织成列族(Column Family)。例如,一...
HBase 的 Java API 提供了多种方法来操作数据,如 put、get、scan 和 delete。put 方法用于插入数据,get 方法用于获取数据,scan 方法用于扫描数据,delete 方法用于删除数据。HBase 的 Java API 还提供了多种工具...
在大数据存储领域,HBase作为一个分布式列式数据库,经常用于处理海量数据的快速查询。由于数据量巨大,分页查询成为必不可少的功能,以避免一次性加载过多数据导致性能问题。本篇将详细介绍HBase如何利用PageFilter...
在Java中操作HBase,过滤数据是至关重要的任务,特别是在处理大数据时,高效地筛选出所需信息能够极大地提升性能。本文将深入探讨HBase的比较过滤器RowFilter的使用源码,帮助你理解如何在实际项目中应用这一关键...
数据类型映射:java类型和hbase的bytes之间的数据转换。 简单操作封装:封装了hbase的put,get,scan等操作为简单的java操作方式。 hbase query封装:封装了hbase的filter,可以使用sql-like的方式操作hbase。...