`
student_lp
  • 浏览: 428907 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

一、hbase查询方式

    hbase的查询实现只提供两种方式:

  • 按指定rowkey获取唯一一条记录:get方法。
  • 按指定条件获取一批记录:scan方法。

    实现条件查询功能使用的就是scan方式,scan在使用时有以下几点值的注意:

  • scan可以通过setCaching与setBatch方法提高速度(以空间换时间)
  • scan可以通过setStartRow与setEndRow来限定范围。范围越小,性能越高。
  • scan可以通过setFilter方法添加过滤器,这也是分页、多条件查询的基础。

二、RowFilter使用

operator description

less

 小于

less_or_equal

 小于等于
equal  等于
not_equal  不等于
greater_or_equal  大于等于
greater  大于
no_op  排除所有
Comparator description
BinaryComparator 使用bytes.comparaTo()比较
BinaryPrefixComparator 和BinaryComparator差不多,从前面开始比较
NullComparator  
BitComparator  
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}
分享到:
评论

相关推荐

    hbase的Rowkey设计方案.pdf

    由于HBase是通过Rowkey查询的,⼀般Rowkey上都会存⼀些⽐较关键的检索信息,我们需要提前想好数据具体需要如何查询,根据查询 ⽅式进⾏数据存储格式的设计,要避免做全表扫描,因为效率特别低。 此外易观⽅⾈也使⽤...

    HBaseRowkey设计要点.pdf

    阿里云 吴阳平(明惠) 阿里云HBase业务架构师 主要章节:

    rowkey设计案例.zip

    Spark存储数据到HBase实现RowKey完全散列-多进程多线程间Random完全随机,完美解决热点问题

    HBase-RowKey与索引设计(高清)

    HBase-RowKey与索引设计(高清) HBase-RowKey与索引设计(高清)HBase-RowKey与索引设计(高清)

    bitcarmanlee#easy-algorithm-interview-and-practice#Hbase rowkey

    2)、RowKey散列原则:如果RowKey是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将RowKey的高位作为散列字段,由程序循环生成,低位放时间

    hbase的rowkey设计与hbase的协处理器运用.docx

    该文档是介绍hbase的rowkey设计与hbase的协处理器运用,与大家分享!

    Hbase行键设计(rowkey)实现多条件查询

    HBASE的使用跟业务逻辑有很强的关联性,就像本文里提到的例子使用ElasticSearch更合适。...本文主要内容是通过合理hbase行键(rowkey)设计实现快速的多条件查询,所采用的方法将所有要用于查询中的列经过一些处理后

    HBase分页查询的rowkey设计技巧

    用户历史订单列表查询rowkey设计技巧 最左前缀原则

    HBaseRowkey的散列与预分区设计

    HBase中,表会被划分为1...n个Region,被托管在RegionServer中。Region二个重要的属性:StartKey与EndKey表示这个Region维护的rowKey范围,当我们要读/写数据时,如果rowKey落在某个start-endkey范围内,那么就会定位...

    基于Hbase的大数据查询优化

    因为面向列的特点,Hbase只能单单地以rowkey为主键作查询,而无法对表进行多维查询和join操作,并且查询通常都是全表扫描,耗费资源较大,查询效率较低。类比于传统型数据库里的一些查询方式,本文对Hbase的存储原理进行了...

    HBASE调优 rowkey

    HBASE调优 HBASE技术框架与存储模型 v HBASE调优 v 硬件 v 系统参数 v java v 表的设计 v 客户端 v 服务器端

    大数据性能调优之HBase的RowKey设计.docx

    大数据性能调优之HBase的RowKey设计.docx

    基于hbase和geohash的矢量数据空间索引方法

    更特定言之,本发明涉及对点、线、面二维矢量数据映射到一维的字符串型rowkey索引,使之能够用hbase存储海量矢量数据,提供高性能空间查询分析服务,特别是一种基于hbase和geohash的矢量数据空间索引方法

    2-2+HBase-RowKey+与索引设计.zip

    2-2+HBase-RowKey+与索引设计

    HBase数据库设计.doc

    5 5)最后,HBase不支持联合查询 5 mapreduce与HBase表配合使用 5 4. HBase的模式Schema设计的一些概念和原则 5 1)模式的创建与更新 5 2)列族的数量 6 3)行键设计RowKey 6 5. HBase的拓扑结构是什么? 7 1)拓扑...

    hbase数据可视化系统

    springboot搭建的hbase可视化界面 支持hbase的建表与删除 支持根据rowkey查询数据

    hbase 2级索引

    基于Solr的HBase多条件查询原理很简单,将HBase表中涉及条件过滤的字段和rowkey在Solr中建立索引,通过Solr的多条件查询快速获得符合过滤条件的rowkey值,拿到这些rowkey之后在HBASE中通过指定rowkey进行查询。

    Hbase 二级索引方案

    然而单一的通过 RowKey 检索数据的方式,不再满足更多的需求,查询成为 Hbase 的瓶颈,人 们更加希望像 Sql 一样快速检索数据,可是,Hbase 之前定位的是大表的存储,要进行这样 的查询,往往是要通过类似 Hive、Pig ...

Global site tag (gtag.js) - Google Analytics