- 浏览: 547866 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (740)
- css (4)
- jquery (8)
- javascript (23)
- html (0)
- uml (0)
- 设计模式 (1)
- 开发工具 (14)
- json (4)
- struts 1.x (3)
- spring (3)
- hibernate (6)
- struts 2.x (17)
- JFreechart (0)
- j2se (48)
- jsp (9)
- flex (22)
- 找工作 (1)
- 技术杂谈 (18)
- 网络编程 (5)
- io流 (1)
- ORACLE (15)
- 报表 (3)
- extjs (11)
- jpbm (2)
- swing (5)
- jspereports (3)
- sql (1)
- linux (15)
- ps (1)
- storm (4)
- hbase (8)
- li (0)
- python (1)
- hive (3)
- 机器学习 (1)
- hdfs (1)
- elasticsearch (1)
- hadoop 2.2 (5)
- hadoop (1)
最新评论
-
Tristan_S:
这个有点意思
ASM -
starryskydog:
程序修改detail band部分的样式 如内容字体大小 ...
使用jasperReport实现动态表头 -
samwong:
Good, so usefule
使用YUI Compressor压缩CSS/JS -
gc715409742:
能够告诉我怎么在web项目中使用YUI Compressor? ...
使用YUI Compressor压缩CSS/JS -
JsonTeye:
您好! 我看你的代码,我现在也在做动态报表,实现功能由用户自己 ...
使用jasperreport动态生成pdf,excel,html
- 本博客是hbase使用filter快速高效查询的方法,我会慢慢补齐
几大Filters
1、Comparision Filters
1.1 RowFilter
1.2 FamilyFilter
1.3 QualifierFilter
1.4 ValueFilter
1.5 DependentColumnFilter
2、Dedicated Filters
2.1 SingleColumnValueFilter
2.2 SingleColumnValueExcludeFilter
2.3 PrefixFilter
2.4 PageFilter
2.5 KeyOnlyFilter
2.6 FirstKeyOnlyFilter
2.7 TimestampsFilter
2.8 RandomRowFilter
3、Decorating Filters
3.1 SkipFilter
3.2 WhileMatchFilters
一个简单的示例 SingleColumnValueFilter
- public static void selectByFilter(String tablename,List<String> arr) throws IOException{
- HTable table=new HTable(hbaseConfig,tablename);
- FilterList filterList = new FilterList();
- Scan s1 = new Scan();
- for (String v:arr){ // 各个条件之间是“与”的关系
- String [] s=v.split("," );
- filterList.addFilter(new SingleColumnValueFilter(Bytes.toBytes(s[ 0 ]),
- Bytes.toBytes(s[1 ]),
- CompareOp.EQUAL,Bytes.toBytes(s[2 ])
- )
- );
- // 添加下面这一行后,则只返回指定的cell,同一行中的其他cell不返回
- // s1.addColumn(Bytes.toBytes(s[0]), Bytes.toBytes(s[1]));
- }
- s1.setFilter(filterList);
- ResultScanner ResultScannerFilterList = table.getScanner(s1);
- for (Result rr=ResultScannerFilterList.next();rr!= null ;rr=ResultScannerFilterList.next()){
- for (KeyValue kv:rr.list()){
- System.out.println("row : " + new String(kv.getRow()));
- System.out.println("column : " + new String(kv.getColumn()));
- System.out.println("value : " + new String(kv.getValue()));
- }
- }
- }
MultipleColumnPrefixFilter
api上介绍如下
- This filter is used for selecting only those keys with columns that matches a particular prefix. For example, if prefix is 'an', it will pass keys will columns like 'and', 'anti' but not keys with columns like 'ball', 'act'.
构造方法如下
- public MultipleColumnPrefixFilter(byte[][] prefixes)
传入多个prefix
源码里说明如下
- public MultipleColumnPrefixFilter(final byte [][] prefixes) {
- if (prefixes != null) {
- for (int i = 0 ; i < prefixes.length ; i++) {
- if (!sortedPrefixes.add(prefixes[i]))
- throw new IllegalArgumentException ("prefixes must be distinct");
- }
- }
- }
示例代码如下:是我从网上找的,看了,没啥难理解的,
- +public class TestMultipleColumnPrefixFilter {
- +
- + private final static HBaseTestingUtility TEST_UTIL = new
- + HBaseTestingUtility();
- +
- + @Test
- + public void testMultipleColumnPrefixFilter() throws IOException {
- + String family = "Family" ;
- + HTableDescriptor htd = new HTableDescriptor("TestMultipleColumnPrefixFilter");
- + htd.addFamily(new HColumnDescriptor(family));
- + // HRegionInfo info = new HRegionInfo(htd, null, null, false);
- + HRegionInfo info = new HRegionInfo(htd.getName(), null, null, false);
- + HRegion region = HRegion .createHRegion(info, HBaseTestingUtility.
- + getTestDir(), TEST_UTIL.getConfiguration(), htd);
- +
- + List< String > rows = generateRandomWords (100, "row");
- + List< String > columns = generateRandomWords (10000, "column");
- + long maxTimestamp = 2 ;
- +
- + List< KeyValue > kvList = new ArrayList < KeyValue > ();
- +
- + Map< String , List < KeyValue > > prefixMap = new HashMap < String ,
- + List< KeyValue > > ();
- +
- + prefixMap.put("p", new ArrayList< KeyValue > ());
- + prefixMap.put("q", new ArrayList< KeyValue > ());
- + prefixMap.put("s", new ArrayList< KeyValue > ());
- +
- + String valueString = "ValueString" ;
- +
- + for (String row: rows) {
- + Put p = new Put(Bytes.toBytes(row));
- + for (String column: columns) {
- + for (long timestamp = 1 ; timestamp < = maxTimestamp; timestamp++) {
- + KeyValue kv = KeyValueTestUtil .create(row, family, column, timestamp,
- + valueString);
- + p.add(kv);
- + kvList.add(kv);
- + for (String s: prefixMap.keySet()) {
- + if (column.startsWith(s)) {
- + prefixMap.get(s).add(kv);
- + }
- + }
- + }
- + }
- + region.put(p);
- + }
- +
- + MultipleColumnPrefixFilter filter;
- + Scan scan = new Scan();
- + scan.setMaxVersions();
- + byte [][] filter_prefix = new byte [2][];
- + filter_prefix[0] = new byte [] {'p'};
- + filter_prefix[1] = new byte [] {'q'};
- +
- + filter = new MultipleColumnPrefixFilter(filter_prefix);
- + scan.setFilter(filter);
- + List< KeyValue > results = new ArrayList < KeyValue > ();
- + InternalScanner scanner = region .getScanner(scan);
- + while(scanner.next(results));
- + assertEquals(prefixMap.get("p").size() + prefixMap.get("q").size(), results.size());
- + }
- +
- + @Test
- + public void testMultipleColumnPrefixFilterWithManyFamilies() throws IOException {
- + String family1 = "Family1" ;
- + String family2 = "Family2" ;
- + HTableDescriptor htd = new HTableDescriptor("TestMultipleColumnPrefixFilter");
- + htd.addFamily(new HColumnDescriptor(family1));
- + htd.addFamily(new HColumnDescriptor(family2));
- + HRegionInfo info = new HRegionInfo(htd.getName(), null, null, false);
- + HRegion region = HRegion .createHRegion(info, HBaseTestingUtility.
- + getTestDir(), TEST_UTIL.getConfiguration(), htd);
- +
- + List< String > rows = generateRandomWords (100, "row");
- + List< String > columns = generateRandomWords (10000, "column");
- + long maxTimestamp = 3 ;
- +
- + List< KeyValue > kvList = new ArrayList < KeyValue > ();
- +
- + Map< String , List < KeyValue > > prefixMap = new HashMap < String ,
- + List< KeyValue > > ();
- +
- + prefixMap.put("p", new ArrayList< KeyValue > ());
- + prefixMap.put("q", new ArrayList< KeyValue > ());
- + prefixMap.put("s", new ArrayList< KeyValue > ());
- +
- + String valueString = "ValueString" ;
- +
- + for (String row: rows) {
- + Put p = new Put(Bytes.toBytes(row));
- + for (String column: columns) {
- + for (long timestamp = 1 ; timestamp < = maxTimestamp; timestamp++) {
- + double rand = Math .random();
- + KeyValue kv;
- + if (rand < 0.5 )
- + kv = KeyValueTestUtil .create(row, family1, column, timestamp,
- + valueString);
- + else
- + kv = KeyValueTestUtil .create(row, family2, column, timestamp,
- + valueString);
- + p.add(kv);
- + kvList.add(kv);
- + for (String s: prefixMap.keySet()) {
- + if (column.startsWith(s)) {
- + prefixMap.get(s).add(kv);
- + }
- + }
- + }
- + }
- + region.put(p);
- + }
- +
- + MultipleColumnPrefixFilter filter;
- + Scan scan = new Scan();
- + scan.setMaxVersions();
- + byte [][] filter_prefix = new byte [2][];
- + filter_prefix[0] = new byte [] {'p'};
- + filter_prefix[1] = new byte [] {'q'};
- +
- + filter = new MultipleColumnPrefixFilter(filter_prefix);
- + scan.setFilter(filter);
- + List< KeyValue > results = new ArrayList < KeyValue > ();
- + InternalScanner scanner = region .getScanner(scan);
- + while(scanner.next(results));
- + assertEquals(prefixMap.get("p").size() + prefixMap.get("q").size(), results.size());
- + }
- +
- + @Test
- + public void testMultipleColumnPrefixFilterWithColumnPrefixFilter() throws IOException {
- + String family = "Family" ;
- + HTableDescriptor htd = new HTableDescriptor("TestMultipleColumnPrefixFilter");
- + htd.addFamily(new HColumnDescriptor(family));
- + HRegionInfo info = new HRegionInfo(htd.getName(), null, null, false);
- + HRegion region = HRegion .createHRegion(info, HBaseTestingUtility.
- + getTestDir(), TEST_UTIL.getConfiguration(),htd);
- +
- + List< String > rows = generateRandomWords (100, "row");
- + List< String > columns = generateRandomWords (10000, "column");
- + long maxTimestamp = 2 ;
- +
- + String valueString = "ValueString" ;
- +
- + for (String row: rows) {
- + Put p = new Put(Bytes.toBytes(row));
- + for (String column: columns) {
- + for (long timestamp = 1 ; timestamp < = maxTimestamp; timestamp++) {
- + KeyValue kv = KeyValueTestUtil .create(row, family, column, timestamp,
- + valueString);
- + p.add(kv);
- + }
- + }
- + region.put(p);
- + }
- +
- + MultipleColumnPrefixFilter multiplePrefixFilter;
- + Scan scan1 = new Scan();
- + scan1.setMaxVersions();
- + byte [][] filter_prefix = new byte [1][];
- + filter_prefix[0] = new byte [] {'p'};
- +
- + multiplePrefixFilter = new MultipleColumnPrefixFilter(filter_prefix);
- + scan1.setFilter(multiplePrefixFilter);
- + List< KeyValue > results1 = new ArrayList < KeyValue > ();
- + InternalScanner scanner1 = region .getScanner(scan1);
- + while(scanner1.next(results1));
- +
- + ColumnPrefixFilter singlePrefixFilter;
- + Scan scan2 = new Scan();
- + scan2.setMaxVersions();
- + singlePrefixFilter = new ColumnPrefixFilter(Bytes.toBytes("p"));
- +
- + scan2.setFilter(singlePrefixFilter);
- + List< KeyValue > results2 = new ArrayList < KeyValue > ();
- + InternalScanner scanner2 = region .getScanner(scan1);
- + while(scanner2.next(results2));
- +
- + assertEquals(results1.size(), results2.size());
- + }
- +
- + List< String > generateRandomWords(int numberOfWords, String suffix) {
- + Set< String > wordSet = new HashSet < String > ();
- + for (int i = 0 ; i < numberOfWords ; i++) {
- + int lengthOfWords = (int) (Math.random()*2) + 1;
- + char[] wordChar = new char[lengthOfWords];
- + for (int j = 0 ; j < wordChar.length ; j++) {
- + wordChar[j] = (char) (Math.random() * 26 + 97);
- + }
- + String word;
- + if (suffix == null) {
- + word = new String(wordChar);
- + } else {
- + word = new String(wordChar) + suffix;
- + }
- + wordSet.add(word);
- + }
- + List< String > wordList = new ArrayList < String > (wordSet);
- + return wordList;
- + }
- +}
- +
- .
ColumnPrefixFilter
- public class ColumnPrefixFilterextends FilterBaseThis filter is used for selecting only those keys with columns that matches a particular prefix. For example, if prefix is 'an', it will pass keys will columns like 'and', 'anti' but not keys with columns like 'ball', 'act'.
上面是类的说明
只有一个有参构造 ColumnPrefixFilter
(byte[] prefix)
这个类用法很简单,就是匹配前缀是prefix的rowkey,但是,不知道大家用了之后有什么感觉,我是用了,但是不起作用,有起作用的大牛告诉我下。
无奈之下,只好选择PrefixFilter
PrefixFilter
类说明 :
Pass results that have same row prefix.
同样的构造方法,跟ColumnPrefixFilter一模一样,用法也相同,
基本上几个Filter就是这些了,慢慢的我再更新这个文章
上段代码,我自己写的,使用中的代码
- public static String getKeywordTableRowkeyUseFilter(String filterString1,String filterString2) {
- FilterList filterList = new FilterList();
- String rowkeyValue = "" ;
- Scan s1 = new Scan();
- String [] sf1=filterString1.split("," );
- filterList.addFilter(new SingleColumnValueFilter(Bytes.toBytes(sf1[ 0 ]),
- Bytes.toBytes(sf1[1 ]),
- CompareOp.EQUAL,Bytes.toBytes(sf1[2 ])
- ));
- String [] sf2=filterString2.split("," );
- filterList.addFilter(new SingleColumnValueFilter(Bytes.toBytes(sf2[ 0 ]),
- Bytes.toBytes(sf2[1 ]),
- CompareOp.EQUAL,Bytes.toBytes(sf2[2 ])
- ));
- filterList.addFilter(new ColumnPrefixFilter(Bytes.toBytes( "3274980668:" ))) ;
- filterList.addFilter(new PrefixFilter(Bytes.toBytes( "3274980668:" ))) ;
- s1.setFilter(filterList);
- ResultScanner ResultScannerFilterList;
- try {
- ResultScannerFilterList = tableKeyword.getScanner(s1);
- for (Result rr=ResultScannerFilterList.next();rr!= null ;rr=ResultScannerFilterList.next()){
- String rowkeyValueTmp = new String(rr.getRow()) ;
- rowkeyValue = rowkeyValue + "##" + rowkeyValueTmp ;
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- log.warn("rowkeyValue" + rowkeyValue) ;
- return rowkeyValue ;
- }
PrefixFilter和ColumnPrefixFilter的用法几乎一样,但是在开发中,建议使用PrefixFilter
发表评论
-
SQL到NOSQL的思维转变
2012-09-23 11:26 864NOSQL系统一般都会宣传一个特性,那就是性能好,然后为什么呢 ... -
HBase0.89常用API接口使用
2012-09-23 11:21 649HTable:这个是table对象,通过他来完成对hbase表 ... -
hbase shell基础和常用命令详解
2012-09-22 17:15 935HBase是一个分布式的、 ... -
FirstKeyOnlyFilter的使用方法及实例
2012-09-22 00:31 1278http://blog.csdn.net/liuxiaoche ... -
关系型数据库到HBase的数据储存方式变迁
2012-09-14 19:32 821如今Bigtable型(列族)数据 ... -
hbase入门
2012-04-22 22:53 927HBase是Hadoop的一个子项目,HBase采用了Go ... -
java实现hbase表创建、数据插入、删除表
2012-04-22 22:31 2505近日查看了相关资料后,梳理了一下用java实现hbase的表创 ...
相关推荐
HBase通过Filter来支持复杂的查询操作。例如,使用`scan '表名', {FILTER => '过滤器'} `可以对表数据进行过滤。过滤器可以是多个,用以组合不同条件。 #### 10. 时间戳和数据版本操作 HBase存储数据时会自动为每条...
1. 快速查询:通过高效的Row Key设计,实现基于地理位置的范围查询和点查询。 2. 空间JOIN操作:通过预计算或者MapReduce任务,模拟实现传统数据库中的JOIN操作。 3. 并行处理:利用HBase的分布式特性,进行大规模...
在探讨HBase查询技巧及其应用时,我们聚焦于利用各种Filter进行精确且高效的查询操作。HBase,作为一款分布式、版本化的列存储数据库,专为海量数据设计,其查询性能和灵活性很大程度上依赖于合理使用Filter。以下是...
- 大数据存储:对于PB级别的数据,HBase能够提供高效的存储和检索。 - 图像和视频元数据存储:存储大量的元数据信息,便于快速查找和过滤。 6. **学习资源** - HBase官方文档:提供详细的技术参考和最佳实践。 ...
- 方案四:选择HBase作为数据存储,广告请求信息写入HBase,曝光和点击时查询HBase,实现日志关联,此方案可充分利用缓存,减少I/O操作。 3. **技术方案** - 整体框架:每个广告请求分配唯一ID,创建关联表存储...
5. **索引和过滤**:虽然HBase不支持像关系数据库那样的复杂查询,但通过行键、列族和时间戳的组合,可以实现高效的数据检索。此外,还可以使用Filter机制对数据进行筛选。 6. **MapReduce集成**:HBase与Hadoop的...
8. **Secondary Index**:虽然HBase不直接支持二级索引,但可以通过实现自定义的Filter或者使用 Coprocessors 来实现类似的功能。 9. **Coprocessors**:这是一种可以在Region Server上运行的用户定义代码,用于...
HBase表设计通常围绕核心的查询模式,例如快速定位到特定的行,或在列族内快速扫描数据。HBase还提供了过滤器来优化查询,例如单列值过滤器、列前缀过滤器、分页过滤器等,这些过滤器可以在服务器端执行,从而减少了...
在大数据存储领域,HBase作为一个分布式列式数据库,经常用于处理海量数据的快速查询。由于数据量巨大,分页查询成为必不可少的功能,以避免一次性加载过多数据导致性能问题。本篇将详细介绍HBase如何利用PageFilter...
- 两者可以通过Hive-on-HBase的方式结合使用,即利用Hive的SQL接口来查询HBase中的数据,增强了HBase的查询灵活性。 #### 2. HBase数据结构 **知识点解析:** HBase的数据模型主要由行键(Row Key)、列族(Column...
实现多条件查询时,可以使用HBase的自定义比较器(Comparator)和过滤器(Filter)。例如,创建一个相等比较器用于实现精确匹配查询,另一个范围比较器用于执行范围查询。这两个比较器结合过滤器,可以在一次Scan...
理解并熟练掌握上述概念和命令,将有助于在实践中高效地使用HBase来处理大规模数据。在设计HBase表结构时,需要综合考虑数据模型、访问模式、存储和计算资源等因素,以达到最佳的性能和可扩展性。
7. **强大的索引和查询机制**:通过RowKey进行快速定位,可以结合Secondary Index和Filter实现复杂查询。 ### HBase 2.3.2的改进与新特性 - **性能优化**:包括读写性能提升、查询效率增强以及更有效的内存管理和...
- **Bloom Filter**:介绍如何使用Bloom Filter来提高查询效率。 #### 三、HBase升级指南 - **从0.20.x或0.89.x升级到0.90.x**:列出具体的步骤与注意事项。 - **从0.90.x到0.92.x**:提供升级路径与建议。 ####...
通过介绍HBase SQL所支持的数据类型,如布尔型、各种整数类型、浮点型等,文章提供了HBase SQL的强大能力,以及其在处理交互式查询时的高效性和性能优势。通过这篇文章,我们可以得知HBase SQL不仅能够支持快速的...
- **0.90.x版本**:2011年1月发布的0.90.0版本成为HBase应用的一个重要里程碑,该版本加入了众多新特性,如Bloom Filter等,显著提升了性能。 - **ZooKeeper集成**:0.20.0版本引入了ZooKeeper来管理BackupMaster...
- **Spark** 是一个快速、通用且可扩展的大数据处理框架,它提供了与Hive的集成,允许开发者使用Spark SQL来执行Hive查询。 - **Spark SQL**:Spark SQL结合了SQL和DataFrame API,使得开发人员可以用SQL或者...
同时,HBase提供了强大的实时查询能力,通过索引和过滤机制,用户可以快速定位到所需数据,满足实时业务需求。 CDH5.14.2中的HBase 1.2.0还支持 Coprocessors 和 Filter,这是两个强大的扩展机制。Coprocessors允许...
HBase的表由行、列族、列和时间戳组成,这种结构使得数据可以根据不同的维度进行快速查询。 3. **Pig**: Apache Pig是一个用于大数据分析的平台,其主要特点是Pig Latin,一种高级脚本语言,简化了大规模数据集的...