hbase RowFilter
RowFilter用于过滤row key
OperatorDescription
LESS小于
LESS_OR_EQUAL小于等于
[EQUAL等于
NOT_EQUAL不等于
GREATER_OR_EQUAL大于等于
GREATER大于
NO_OP排除所有
ComparatorDescription
BinaryComparator使用Bytes.compareTo()比较
BinaryPrefixComparator和BinaryComparator差不多,从前面开始比较
NullComparatorDoes not compare against an actual value but whether a given one is null, or not null.
BitComparatorPerforms a bitwise comparison, providing a BitwiseOp class with OR, and XOR operators.
RegexStringComparator正则表达式
SubstringComparator把数据当成字符串,用contains()来判断
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
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.BinaryPrefixComparator;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.RegexStringComparator;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.filter.SubstringComparator;
public class TestHbaseRowFilter {
String tableName = "test_row_filter";
Configuration config = HBaseConfiguration.create();
/**
* 部分代码来自hbase权威指南
* @throws IOException
*/
public void testRowFilter() throws IOException {
HTable table = new HTable(config, tableName);
Scan scan = new Scan();
System.out.println("小于等于row010的行");
Filter filter1 = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,
new BinaryComparator("row010".getBytes()));
scan.setFilter(filter1);
ResultScanner scanner1 = table.getScanner(scan);
for (Result res : scanner1) {
System.out.println(res);
}
scanner1.close();
System.out.println("正则获取结尾为5的行");
Filter filter2 = new RowFilter(CompareFilter.CompareOp.EQUAL,
new RegexStringComparator(".*5[ DISCUZ_CODE_0 ]quot;));
scan.setFilter(filter2);
ResultScanner scanner2 = table.getScanner(scan);
for (Result res : scanner2) {
System.out.println(res);
}
scanner2.close();
System.out.println("包含有5的行");
Filter filter3 = new RowFilter(CompareFilter.CompareOp.EQUAL,
new SubstringComparator("5"));
scan.setFilter(filter3);
ResultScanner scanner3 = table.getScanner(scan);
for (Result res : scanner3) {
System.out.println(res);
}
scanner3.close();
System.out.println("开头是row01的");
Filter filter4 = new RowFilter(CompareFilter.CompareOp.EQUAL,
new BinaryPrefixComparator("row01".getBytes()));
scan.setFilter(filter4);
ResultScanner scanner4 = table.getScanner(scan);
for (Result res : scanner4) {
System.out.println(res);
}
scanner3.close();
}
/**
* 初始化数据
*/
public void init() {
// 创建表和初始化数据
try {
HBaseAdmin admin = new HBaseAdmin(config);
if (!admin.tableExists(tableName)) {
HTableDescriptor htd = new HTableDescriptor(tableName);
HColumnDescriptor hcd1 = new HColumnDescriptor("data");
htd.addFamily(hcd1);
HColumnDescriptor hcd2 = new HColumnDescriptor("url");
htd.addFamily(hcd2);
admin.createTable(htd);
}
HTable table = new HTable(config, tableName);
table.setAutoFlush(false);
int count = 50;
for (int i = 1; i <= count; ++i) {
Put p = new Put(String.format("row%03d", i).getBytes());
p.add("data".getBytes(), String.format("col%01d", i % 10)
.getBytes(), String.format("data%03d", i).getBytes());
p.add("url".getBytes(), String.format("col%01d", i % 10)
.getBytes(), String.format("url%03d", i).getBytes());
table.put(p);
}
table.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
TestHbaseRowFilter test = new TestHbaseRowFilter();
test.init();
test.testRowFilter();
}
}
小于等于row010的行
keyvalues={row001/data:col1/1364133382268/Put/vlen=7, row001/url:col1/1364133382268/Put/vlen=6}
keyvalues={row002/data:col2/1364133382268/Put/vlen=7, row002/url:col2/1364133382268/Put/vlen=6}
keyvalues={row003/data:col3/1364133382268/Put/vlen=7, row003/url:col3/1364133382268/Put/vlen=6}
keyvalues={row004/data:col4/1364133382268/Put/vlen=7, row004/url:col4/1364133382268/Put/vlen=6}
keyvalues={row005/data:col5/1364133382268/Put/vlen=7, row005/url:col5/1364133382268/Put/vlen=6}
keyvalues={row006/data:col6/1364133382268/Put/vlen=7, row006/url:col6/1364133382268/Put/vlen=6}
keyvalues={row007/data:col7/1364133382268/Put/vlen=7, row007/url:col7/1364133382268/Put/vlen=6}
keyvalues={row008/data:col8/1364133382268/Put/vlen=7, row008/url:col8/1364133382268/Put/vlen=6}
keyvalues={row009/data:col9/1364133382268/Put/vlen=7, row009/url:col9/1364133382268/Put/vlen=6}
keyvalues={row010/data:col0/1364133382268/Put/vlen=7, row010/url:col0/1364133382268/Put/vlen=6}
正则获取结尾为5的行
keyvalues={row005/data:col5/1364133382268/Put/vlen=7, row005/url:col5/1364133382268/Put/vlen=6}
keyvalues={row015/data:col5/1364133382268/Put/vlen=7, row015/url:col5/1364133382268/Put/vlen=6}
keyvalues={row025/data:col5/1364133382268/Put/vlen=7, row025/url:col5/1364133382268/Put/vlen=6}
keyvalues={row035/data:col5/1364133382268/Put/vlen=7, row035/url:col5/1364133382268/Put/vlen=6}
keyvalues={row045/data:col5/1364133382268/Put/vlen=7, row045/url:col5/1364133382268/Put/vlen=6}
包行有5的行
keyvalues={row005/data:col5/1364133382268/Put/vlen=7, row005/url:col5/1364133382268/Put/vlen=6}
keyvalues={row015/data:col5/1364133382268/Put/vlen=7, row015/url:col5/1364133382268/Put/vlen=6}
keyvalues={row025/data:col5/1364133382268/Put/vlen=7, row025/url:col5/1364133382268/Put/vlen=6}
keyvalues={row035/data:col5/1364133382268/Put/vlen=7, row035/url:col5/1364133382268/Put/vlen=6}
keyvalues={row045/data:col5/1364133382268/Put/vlen=7, row045/url:col5/1364133382268/Put/vlen=6}
keyvalues={row050/data:col0/1364133382268/Put/vlen=7, row050/url:col0/1364133382268/Put/vlen=6}
开头是row01的
keyvalues={row010/data:col0/1364133382268/Put/vlen=7, row010/url:col0/1364133382268/Put/vlen=6}
keyvalues={row011/data:col1/1364133382268/Put/vlen=7, row011/url:col1/1364133382268/Put/vlen=6}
keyvalues={row012/data:col2/1364133382268/Put/vlen=7, row012/url:col2/1364133382268/Put/vlen=6}
keyvalues={row013/data:col3/1364133382268/Put/vlen=7, row013/url:col3/1364133382268/Put/vlen=6}
keyvalues={row014/data:col4/1364133382268/Put/vlen=7, row014/url:col4/1364133382268/Put/vlen=6}
keyvalues={row015/data:col5/1364133382268/Put/vlen=7, row015/url:col5/1364133382268/Put/vlen=6}
keyvalues={row016/data:col6/1364133382268/Put/vlen=7, row016/url:col6/1364133382268/Put/vlen=6}
keyvalues={row017/data:col7/1364133382268/Put/vlen=7, row017/url:col7/1364133382268/Put/vlen=6}
keyvalues={row018/data:col8/1364133382268/Put/vlen=7, row018/url:col8/1364133382268/Put/vlen=6}
keyvalues={row019/data:col9/1364133382268/Put/vlen=7, row019/url:col9/1364133382268/Put/vlen=6}
转载于:https://my.oschina.net/u/923508/blog/611991
相关推荐
本文将深入探讨HBase的比较过滤器RowFilter的使用源码,帮助你理解如何在实际项目中应用这一关键功能。 RowFilter是HBase提供的过滤器之一,它允许我们根据行键(row key)来过滤表中的数据。在Java API中,我们...
3. **数据过滤与扫描**:HBase提供了丰富的数据过滤器,如RowFilter、ColumnValueFilter等,可以有效地筛选出需要的数据。在1.6.0中,过滤器的实现和性能得到了优化,使得大规模数据查询更加灵活高效。 4. **Region...
对于过滤器,可以创建各种类型的Filter对象,如`PrefixFilter`、`RowFilter`等,并将其设置到`Scan`对象上。 为了提高效率,HBase还提供了预读取(Prefetching)功能,可以在扫描时预先加载一些行,减少网络延迟。...
6. **过滤器机制**:HBase提供了丰富的过滤器类,如RowFilter、ColumnValueFilter等,用于在数据检索时进行条件筛选,提升查询效率。 7. **数据模型设计**:设计良好的HBase表结构对于实现高效查询至关重要。例如,...
7. **过滤器和比较器**:HBase支持丰富的过滤器和比较器,用于在查询时实现更复杂的筛选逻辑,如RowFilter、QualifierFilter、ValueFilter等。 8. **性能优化**:在开发过程中,了解和利用HBase的预读取(Block...
1. **过滤器使用**:善用Filter,如RowFilter、PrefixFilter等,减少不必要的数据扫描。 2. **布隆过滤器**:在不确定数据是否存在时,使用Bloom Filter避免无效的磁盘访问。 3. **Scan优化**:限制返回结果的数量,...
在大数据处理领域,HBase是一个分布式、面向列的NoSQL数据库,它构建于Apache Hadoop之上,提供高可靠性、高性能、可伸缩的数据存储。HappyBase是Python的一个库,为HBase提供了简单易用的API,使得开发者可以方便地...
HBase shell及常用命令 HBase Shell是HBase数据库的命令行工具,用户可以使用HBase Shell与HBase进行交互。HBase Shell是一个封装了Java客户端API的JRuby应用软件,在HBase的HMaster主机上通过命令行输入hbase ...
HBase提供了多种内置过滤器,如SingleColumnValueFilter、RowFilter、PrefixFilter等,每种过滤器都有其特定的应用场景。 1. SingleColumnValueFilter:这种过滤器用于检查特定列族和列的值是否满足用户定义的比较...
1. PageFilter不能与行键范围过滤器(如PrefixFilter, RowFilter等)一起使用,因为它们会改变行的扫描顺序,导致PageFilter失效。 2. 获取总页数和总条目数通常需要额外的统计操作,例如使用CountingBloomFilter...
4. 行键过滤:通过行键过滤器(RowFilter)筛选数据。 5. 列过滤:使用列过滤器(ColumnFilter)限制返回的列族或列。 6. 时间戳过滤:根据时间戳选择数据版本。 7. 分页查询:通过设置Scan对象的startRow和stopRow...
8. **过滤器机制**:HBase提供了一系列过滤器,如RowFilter、ColumnValueFilter等,可以用于在读取数据时进行高效筛选,减少不必要的网络传输和计算。 9. ** Coprocessor机制**:HBase引入了Coprocessor框架,允许...
•过滤器可以应用到行键(RowFilter),列限定符(QualifierFilter)或者数据值(ValueFilter) •过滤器允许对数据分页处理(PageFilter),限制扫描器返回行数 •FilterList可以组合使用多个Filter
7. **过滤器和扫描器**:验证不同类型的过滤器(如RowFilter、ColumnPrefixFilter等)和扫描器的使用,以实现复杂的数据查询。 8. **性能测试**:衡量在高并发下的读写性能,以及HBase如何通过缓存和预读优化性能。...
例如,要查询某一天的URL扫描数据,可以使用RowFilter结合比较器匹配日期和状态。对于范围查询,如查找某一天内所有状态为"关闭"的URL,可以通过设置RangeFilter来实现。通过这种方式,即使在不支持复杂查询的HBase...
- **RowFilter**:根据行键进行过滤。 - **FamilyFilter**:依据列族来筛选数据。 - **QualifierFilter**:用于过滤具体的列标识符。 - **ValueFilter**:基于单元格值进行过滤。 - **DependentColumnFilter**:对...
•过滤器可以应用到行键(RowFilter),列限定符(QualifierFilter)或者数据值(ValueFilter) •过滤器允许对数据分页处理(PageFilter),限制扫描器返回行数 •FilterList可以组合使用多个Filter
•过滤器可以应用到行键(RowFilter),列限定符(QualifierFilter)或者数据值(ValueFilter) •过滤器允许对数据分页处理(PageFilter),限制扫描器返回行数 •FilterList可以组合使用多个Filter
•过滤器可以应用到行键(RowFilter),列限定符(QualifierFilter)或者数据值(ValueFilter) •过滤器允许对数据分页处理(PageFilter),限制扫描器返回行数 •FilterList可以组合使用多个Filter
8. **Rowkey过滤器(RowFilter)** - 了解RowKey过滤器的功能和使用场景。 - 学习如何构建有效的RowKey来优化查询性能。 9. **Hbase补充知识** - 探讨HBase与Hadoop生态系统其他组件的集成。 - 了解最新的HBase...