《Hbase 4》--Scan缓存机制与bacth批量查询、filter过滤器、Hbase和MapReduce整合运行单词统计测试

本文详细介绍了HBase的Scan缓存机制,包括设置缓存的三种方式以及缓存对查询性能的影响。此外,讨论了bacth批量查询的设置和测试,以及如何利用Filter过滤器对数据进行精细化筛选。同时,文章还展示了HBase与MapReduce的整合,用于执行单词统计任务。
摘要由CSDN通过智能技术生成

一、Scan 缓存机制: 3.5.3

       通过Scan扫描,每一次调用next()方法都会生成一个单独的PRC请求,并且返回一条记录。
       缓存可以让next()一次获取多条记录。
  设置缓存方式有两种 :
        1)表Htable层面 setScannerCaching(int)
        2)Scan类  setCaching(int)                                                                                                                                                                  3)通过设置配置文件hbase-site.xml
           <property>
                 <name>hbase.client.scanner.caching</name>
                 <value>10</value>
           </property>

    优先级顺序为: scan类 -->Htable类-->配置文件

缓存是面向行一级的操作,而批量则是面向列一级的操作


二、设置bacth批量查询:

      批量可以让用户选择每一次ResultScanner实例的next()操作要取回多少列
      例如,setBatch(5),则一次next()返回的Resulut实例包括5列                                                                                                        

三、测试设置缓存和批量查询的时间:

    不设置缓存查询时间: 9978
    设置缓存查询时间:   9890 

public static void findAll(String tablename){
    try {

        Table table = conn.getTable(TableName.valueOf(tablename));
        //EQUAL    匹配等于设定值的值
        Scan scan = new Scan();
      //设置扫描批次,一次next()返回 Result实例会包括5列
      //scan.setBatch(5);
      //hbase设置缓存
      //scan.setCaching(100);
        
        long starttime = System.currentTimeMillis(); 
        ResultScanner scanner = table.getScanner(scan);
        Iterator<Result> its = scanner.iterator();
        while (its.hasNext()) {
            printOut(its.next());
        }
        scanner.close();
        System.out.println(System.currentTimeMillis()-starttime);
        System.out.println("---查询成功!---");
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("---查询失败!---");
    }
}

 

Filter过滤器:

       HBase中两种主要的数据读取函数  是get和scan,但是他们缺少一些细粒度的筛选功能,
       不能对行键、列名或列值进行过滤,但是通过滤过器可以达到这个目的。

       get ()和scan () ,它们都支持直接访问数据和通过指定起止行键访问数据的功能。
       可以在查询中添加更多的限制条件来减少查询得到的数据量,这些限制可以是指定列族、列、时间戳以及版本号


谓词下推:所有的过滤器都在服务器端生效,这样可以保证被过滤掉的数据不会被传送到客户端.

定义Filter时,需要考虑三个对象:
比较运算符:CompareFilter
定义对应的比较器:
定义对应的过滤器:RowFilter、familyFilter、valueFilter、QualiterFilter等

1)查询testA表中值为aaa的数据 
hbase(main):023:0> scan 'testA',{FILTER => "ValueFilter(=, 'binary:aaa')"}
ROW                                 COLUMN+CELL                                                                                          
 row-1                              column=FA1:a, timestamp=1558225046619, value=aaa                                                     
 row-1                              column=FB2:a, timestamp=1558225625470, value=aaa  
 

public static void findAll(String tablename){
    try {

        Table table = conn.getTable(TableName.valueOf(tablename));
        //EQUAL    匹配等于设定值的值
        Filter filter = new ValueFilter(CompareOp.EQUAL,new SubstringComparator("aaa"));
      //Filter filter = new ValueFilter(CompareOp.EQUAL, 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值