HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行键,列明,时间戳定位)。通常来说,通过行键,值来筛选数据的应用场景较多。
1. RowFilter:筛选出匹配的所有的行,对于这个过滤器的应用场景,是非常直观的:使用BinaryComparator可以筛选出具有某个行键的行,或者通过改变比较运算符(下面的例子中是CompareFilter.CompareOp.EQUAL)来筛选出符合某一条件的多条数据,以下就是筛选出行键为row1的一行数据:
-
Filterrf=newRowFilter(CompareFilter.CompareOp.EQUAL,newBinaryComparator(Bytes.toBytes("row1")));
2.PrefixFilter:筛选出具有特定前缀的行键的数据。这个过滤器所实现的功能其实也可以由RowFilter结合RegexComparator来实现,不过这里提供了一种简便的使用方法,以下过滤器就是筛选出行键以row为前缀的所有的行:
-
Filterpf=newPrefixFilter(Bytes.toBytes("row"));
3.KeyOnlyFilter:这个过滤器唯一的功能就是只返回每行的行键,值全部为空,这对于只关注于行键的应用场景来说非常合适,这样忽略掉其值就可以减少传递到客户端的数据量,能起到一定的优化作用:
-
Filterkof=newKeyOnlyFilter();
4.RandomRowFilter:从名字上就可以看出其大概的用法,本过滤器的作用就是按照一定的几率(<=0会过滤掉所有的行,>=1会包含所有的行)来返回随机的结果集,对于同样的数据集,多次使用同一个RandomRowFilter会返回不通的结果集,对于需要随机抽取一部分数据的应用场景,可以使用此过滤器:
-
Filterrrf=newRandomRowFilter((float)0.8);
5.InclusiveStopFilter:扫描的时候,我们可以设置一个开始行键和一个终止行键,默认情况下,这个行键的返回是前闭后开区间,即包含起始行,单不包含中指行,如果我们想要同时包含起始行和终止行,那么我们可以使用此过滤器:
-
Filterisf=newInclusiveStopFilter(Bytes.toBytes("row1"));
6.FirstKeyOnlyFilter:如果你只想返回的结果集中只包含第一列的数据,那么这个过滤器能够满足你的要求。它在找到每行的第一列之后会停止扫描,从而使扫描的性能也得到了一定的提升:
-
Filterfkof=newFirstKeyOnlyFilter();
7.ColumnPrefixFilter:顾名思义,它是按照列名的前缀来筛选单元格的,如果我们想要对返回的列的前缀加以限制的话,可以使用这个过滤器:
-
Filtercpf=newColumnPrefixFilter(Bytes.toBytes("qual1"));
8.ValueFilter:按照具体的值来筛选单元格的过滤器,这会把一行中值不能满足的单元格过滤掉,如下面的构造器,对于每一行的一个列,如果其对应的值不包含ROW2_QUAL1,那么这个列就不会返回给客户端:
-
Filtervf=newValueFilter(CompareFilter.CompareOp.EQUAL,newSubstringComparator("ROW2_QUAL1"));
9.ColumnCountGetFilter:这个过滤器来返回每行最多返回多少列,并在遇到一行的列数超过我们所设置的限制值的时候,结束扫描操作:
-
Filterccf=newColumnCountGetFilter(2);
10.SingleColumnValueFilter:用一列的值决定这一行的数据是否被过滤。在它的具体对象上,可以调用setFilterIfMissing(true)或者setFilterIfMissing(false),默认的值是false,其作用是,对于咱们要使用作为条件的列,如果这一列本身就不存在,那么如果为true,这样的行将会被过滤掉,如果为false,这样的行会包含在结果集中。
-
SingleColumnValueFilterscvf=newSingleColumnValueFilter(
-
Bytes.toBytes("colfam1"),
-
Bytes.toBytes("qual2"),
-
CompareFilter.CompareOp.NOT_EQUAL,
-
newSubstringComparator("BOGUS"));
-
scvf.setFilterIfMissing(false);
-
scvf.setLatestVersionOnly(true);
11.SingleColumnValueExcludeFilter:这个与10种的过滤器唯一的区别就是,作为筛选条件的列的不会包含在返回的结果中。
12.SkipFilter:这是一种附加过滤器,其与ValueFilter结合使用,如果发现一行中的某一列不符合条件,那么整行就会被过滤掉:
-
Filterskf=newSkipFilter(vf);
13.WhileMatchFilter:这个过滤器的应用场景也很简单,如果你想要在遇到某种条件数据之前的数据时,就可以使用这个过滤器;当遇到不符合设定条件的数据的时候,整个扫描也就结束了:
-
Filterwmf=newWhileMatchFilter(rf);
14.FilterList:用于综合使用多个过滤器。其有两种关系:FilterList.Operator.MUST_PASS_ONE和FilterList.Operator.MUST_PASS_ALL,默认的是FilterList.Operator.MUST_PASS_ALL,顾名思义,它们分别是AND和OR的关系,并且FilterList可以嵌套使用FilterList,使我们能够表达更多的需求:
-
List<Filter>filters=newArrayList<Filter>();
-
filters.add(rf);
-
filters.add(vf);
-
FilterListfl=newFilterList(FilterList.Operator.MUST_PASS_ALL,filters);
以上,是对于HBase内置的过滤器的部分总结,以下代码是数据写入代码:
-
packagecom.reyun.hbase;
-
-
importjava.io.IOException;
-
importorg.apache.hadoop.conf.Configuration;
-
importorg.apache.hadoop.hbase.HBaseConfiguration;
-
importorg.apache.hadoop.hbase.client.HTable;
-
importorg.apache.hadoop.hbase.client.Put;
-
importorg.apache.hadoop.hbase.util.Bytes;
-
-
publicclassHBaseDataFeeding{
-
privatefinalstaticbyte[]ROW1=Bytes.toBytes("row1");
-
privatefinalstaticbyte[]ROW2=Bytes.toBytes("row2");
-
privatefinalstaticbyte[]COLFAM1=Bytes.toBytes("colfam1");
-
privatefinalstaticbyte[]COLFAM2=Bytes.toBytes("colfam2");
-
privatefinalstaticbyte[]QUAL1=Bytes.toBytes("qual1");
-
privatefinalstaticbyte[]QUAL2=Bytes.toBytes("qual2");
-
-
-
publicstaticvoidmain(String[]args)throwsIOException{
-
Configurationconf=HBaseConfiguration.create();
-
HTabletable=newHTable(conf,"testtable");
-
table.setAutoFlushTo(false);
-
Putput_row1=newPut(ROW1);
-
put_row1.add(COLFAM1,QUAL1,Bytes.toBytes("ROW1_QUAL1_VAL"));
-
put_row1.add(COLFAM1,QUAL2,Bytes.toBytes("ROW1_QUAL2_VAL"));
-
-
Putput_row2=newPut(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();
-
}
-
}
-
-
}
以下是过滤器测试代码,可以通过修改代码,更换过滤器来看到具体的效果:
-
packagecom.reyun.hbase;
-
-
importjava.io.IOException;
-
importjava.util.ArrayList;
-
importjava.util.List;
-
-
importorg.apache.hadoop.conf.Configuration;
-
importorg.apache.hadoop.hbase.Cell;
-
importorg.apache.hadoop.hbase.CellUtil;
-
importorg.apache.hadoop.hbase.HBaseConfiguration;
-
importorg.apache.hadoop.hbase.client.HTable;
-
importorg.apache.hadoop.hbase.client.Result;
-
importorg.apache.hadoop.hbase.client.ResultScanner;
-
importorg.apache.hadoop.hbase.client.Scan;
-
importorg.apache.hadoop.hbase.filter.BinaryComparator;
-
importorg.apache.hadoop.hbase.filter.ColumnCountGetFilter;
-
importorg.apache.hadoop.hbase.filter.ColumnPrefixFilter;
-
importorg.apache.hadoop.hbase.filter.CompareFilter;
-
importorg.apache.hadoop.hbase.filter.Filter;
-
importorg.apache.hadoop.hbase.filter.FilterList;
-
importorg.apache.hadoop.hbase.filter.FirstKeyOnlyFilter;
-
importorg.apache.hadoop.hbase.filter.InclusiveStopFilter;
-
importorg.apache.hadoop.hbase.filter.KeyOnlyFilter;
-
importorg.apache.hadoop.hbase.filter.PageFilter;
-
importorg.apache.hadoop.hbase.filter.PrefixFilter;
-
importorg.apache.hadoop.hbase.filter.RandomRowFilter;
-
importorg.apache.hadoop.hbase.filter.RowFilter;
-
importorg.apache.hadoop.hbase.filter.SkipFilter;
-
importorg.apache.hadoop.hbase.filter.ValueFilter;
-
importorg.apache.hadoop.hbase.filter.SingleColumnValueFilter;
-
importorg.apache.hadoop.hbase.filter.SubstringComparator;
-
importorg.apache.hadoop.hbase.filter.WhileMatchFilter;
-
importorg.apache.hadoop.hbase.util.Bytes;
-
-
publicclassHBaseScannerTest{
-
-
publicstaticvoidmain(String[]args)throwsIOException,IllegalAccessException{
-
Configurationconf=HBaseConfiguration.create();
-
HTabletable=newHTable(conf,"testtable");
-
table.setAutoFlushTo(false);
-
-
Scanscan1=newScan();
-
SingleColumnValueFilterscvf=newSingleColumnValueFilter(
-
Bytes.toBytes("colfam1"),
-
Bytes.toBytes("qual2"),
-
CompareFilter.CompareOp.NOT_EQUAL,
-
newSubstringComparator("BOGUS"));
-
scvf.setFilterIfMissing(false);
-
scvf.setLatestVersionOnly(true);
-
Filterccf=newColumnCountGetFilter(2);
-
Filtervf=newValueFilter(CompareFilter.CompareOp.EQUAL,newSubstringComparator("ROW2_QUAL1"));
-
Filtercpf=newColumnPrefixFilter(Bytes.toBytes("qual2"));
-
Filterfkof=newFirstKeyOnlyFilter();
-
Filterisf=newInclusiveStopFilter(Bytes.toBytes("row1"));
-
Filterrrf=newRandomRowFilter((float)0.8);
-
Filterkof=newKeyOnlyFilter();
-
Filterpf=newPrefixFilter(Bytes.toBytes("row"));
-
Filterrf=newRowFilter(CompareFilter.CompareOp.NOT_EQUAL,newBinaryComparator(Bytes.toBytes("row1")));
-
Filterwmf=newWhileMatchFilter(rf);
-
Filterskf=newSkipFilter(vf);
-
-
List<Filter>filters=newArrayList<Filter>();
-
filters.add(rf);
-
filters.add(vf);
-
FilterListfl=newFilterList(FilterList.Operator.MUST_PASS_ALL,filters);
-
-
scan1.
-
setStartRow(Bytes.toBytes("row1")).
-
setStopRow(Bytes.toBytes("row3")).
-
setFilter(scvf);
-
ResultScannerscanner1=table.getScanner(scan1);
-
-
for(Resultres:scanner1){
-
for(Cellcell:res.rawCells()){
-
System.out.println("KV:"+cell+",Value:"+Bytes.toString(CellUtil.cloneValue(cell)));
-
}
-
System.out.println("------------------------------------------------------------");
-
}
-
-
scanner1.close();
-
table.close();
-
}
-
-
}
-
分享到:
相关推荐
HBase提供了多种内置过滤器,如SingleColumnValueFilter、RowFilter、PrefixFilter等,每种过滤器都有其特定的应用场景。 1. SingleColumnValueFilter:这种过滤器用于检查特定列族和列的值是否满足用户定义的比较...
6. **HBase的监控与调优**:HBase内置了丰富的监控指标,如RegionServer状态、内存使用、请求数量等,可以通过JMX、HBase Web UI或Ambari等工具进行监控。根据这些指标,可以进行性能调优,比如调整Region大小、增加...
PageFilter是HBase提供的一个内置过滤器,专门用于实现分页查询。它允许用户在查询时设定每页的数据量,进而控制返回结果的规模。PageFilter的核心思想是限制结果集的大小,而不是精确地筛选出特定行或列。 **二、...
可以通过创建二级索引来优化特定查询,或者使用内置的过滤器来过滤不符合条件的数据。 8. **容错和恢复**: - HBase具有高可靠性,当某个节点发生故障时,系统可以自动将数据迁移到其他节点,并保证数据的可用性...
实验结果表明,这种基于协处理器的二级索引方法在查询性能上优于HBase内置的过滤查询,同时与基于ElasticSearch的二级索引相比,查询速度更快且空间开销更小。这意味着,这种二级索引方法在满足高效查询需求的同时,...
尽管HBase没有内置的回滚机制来保证一致性,但它使用时间戳过滤器提供了某种程度的隔离性,防止脏读。 此外,文档提到了三个Apache项目:Omid、Tephra和Trafodion,这三个项目都致力于在HBase中实现事务支持。Omid...
HBase有两个内置的命名空间: - `hbase`: 用于存放HBase内部所需的表。 - `default`: 所有没有明确指定命名空间的表都会自动放入此命名空间中。 **1.4 创建命名空间中的表** 在创建表时,可以通过以下格式指定表...
总结,HBase虽然没有内置的分页功能,但通过扫描器和各种策略,我们可以实现高效、灵活的分页查询。在实际应用中,结合Java API和合理的配置,可以充分利用HBase的优势,处理大数据量的分页场景。
连接器实现了标准的外部数据源,支持内置的过滤器,易于维护。此外,它还为Spark SQL提供了完善的数据帧支持和集成语言查询能力,通过分区剪枝、数据本地性、列剪枝和谓词推下的方式实现高性能。 SHC支持不同的数据...
- 了解RowKey过滤器的功能和使用场景。 - 学习如何构建有效的RowKey来优化查询性能。 9. **Hbase补充知识** - 探讨HBase与Hadoop生态系统其他组件的集成。 - 了解最新的HBase特性和改进。 #### 四、Spark教程 ...
开发者可以设置过滤器和限制条件,优化扫描性能。 5. **事务支持**:尽管HBase本身支持多行事务,但Happybase通过提供事务上下文管理器简化了Python中的事务处理。 6. **序列化与反序列化**:Happybase内置了对...
- `plugins` 目录则包含了一些预定义的数据处理插件,如Filter(过滤)、Transform(转换)和Sink(输出)等,用户可以自定义扩展或选择内置插件进行数据操作。 3. **数据输入和输出**: - Seatunnel支持多种数据...
3. SQL编辑:内置的SQL编辑器支持智能提示,自动完成代码,以及语法高亮,便于编写和调试SQL语句。 4. 数据操作:添加、修改和删除数据,执行DML操作。 5. 数据设计:创建和修改数据库表结构,定义字段、索引和约束...
3. **任务调度**:DataX内置了任务调度器,负责任务的执行和监控,包括并行度控制、错误处理策略等。 4. **数据转换**:在数据传输过程中,DataX支持简单的数据转换,如字段映射、数据类型转换等。 5. **性能优化**...
总结来说,Flume拦截器是实现数据采集过程中预处理的关键工具,它能够根据实际需求对数据进行清洗、转换、过滤或增强,从而提高数据质量,为后续的大数据分析提供更好的原料。通过灵活配置和自定义拦截器,我们可以...
3. **计算属性与侦听器**:vuetest01可能使用了计算属性来处理复杂的数据逻辑,如计算总价或过滤列表。同时,Vue的侦听器监听数据变化,当特定数据发生变化时执行相应函数。 4. **路由管理**:如果vuetest01使用了...
内置计数器 用户定义的Java计数器 用户定义的Streaming计数器 排序 准备 部分排序 总排序 二次排序 联接 map端联接 reduce端联接 边数据分布 利用JobConf来配置作业 分布式缓存 MapReduce库类 第9章 构建Hadoop集群 ...
内置计数器 用户定义的Java计数器 用户定义的Streaming计数器 排序 准备 部分排序 总排序 二次排序 联接 map端联接 reduce端联接 边数据分布 利用JobConf来配置作业 分布式缓存 ...