zoukankan      html  css  js  c++  java
  • HBase笔记--filter的使用

    HBASE过滤器介绍:

            所有的过滤器都在服务端生效,叫做谓语下推(predicate push down),这样可以保证被过滤掉的数据不会被传送到客户端。

            注意
            基于字符串的比较器,如RegexStringComparator和SubstringComparator,比基于字节的比较器更,更消耗资源。因为每次比较时它们都需要将给定的值转化为String.截取字符串子串和正则式的处理也需要花费额外的时间。

            过滤器本来的目的是为了筛掉无用的信息,所有基于CompareFilter的过滤处理过程是返回匹配的值。

    各种自定义过滤器: http://www.cnblogs.com/chshnan/archive/2013/03/27/2984143.html

    HBase利用Scan对表进行扫描

    Scan scan = new Scan();  
    ResultScanner scanner = table.getScanner(scan);  
    for (Result result : scanner) {//ResultScanner实现了Iterator接口  
        //do something here  
    }  

    可以使用如下方法对输出数据进行选择

        // 返回指定列族下的指定qualifier中的值   
        public Scan addColumn(byte[] family, byte[] qualifier)  
        // 设置扫描的起始行,starRow是存储时候用的rowKey  
        public Scan setStartRow(byte[] startRow)  
        // 设置扫描的结束行,stopRow是存储时候用的rowKey 
        public Scan setStopRow(byte[] stopRow)  
        // 设置返回结果的时间戳 
        public Scan setTimeStamp(long timestamp)  
        //设置返回结果的时间戳返回 
        public Scan setTimeRange(long minStamp, long maxStamp)  
        //设置过滤器,这是非常灵活的扫描机制 
        public Scan setFilter(Filter filter)  

    如何使用Filter

    HBase提供了很多预装过滤器

    1. RowFilter 行过滤器(基于行键过滤数据)
    public RowFilter(CompareOp rowCompareOp, WritableByteArrayComparable rowComparator)
    RowFilter是用来对rowkey进行过滤的,比较符如下:

    Operator

    Description

    LESS

    小于

    LESS_OR_EQUAL

    小于等于

    EQUAL

    等于

    NOT_EQUAL

    不等于

    GREATER_OR_EQUAL

    大于等于

    GREATER

    大于

    NO_OP

    排除所有



    Comparator

    Description

    BinaryComparator

    使用Bytes.compareTo()比较

    BinaryPrefixComparator

    和BinaryComparator差不多,从前面开始比较

    NullComparator

    Does not compare against an actual value but whether a given one is null, or not null.

    BitComparator

    Performs a bitwise comparison, providing a BitwiseOp class with AND, OR, and XOR operators.

    RegexStringComparator

    正则表达式

    SubstringComparator

    把数据当成字符串,用contains()来判断

    例:
    相关的过滤方法使用:
    提取rowkey以01结尾数据
    Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new RegexStringComparator(".*01$"));

    提取rowkey以包含201407的数据
    Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new SubstringComparator("201407"));

    提取rowkey以123开头的数据
    Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new BinaryPrefixComparator("123".getBytes()));

    2. 前缀过滤器(RowFilter的特例)
    String prefix = "a";
    Scan scan = new Scan(prefix.getBytes());
    scan.setFilter(new PrefixFilter(prefix.getBytes()));

    3. 限定符过滤器(类似于行过滤器RowFilter的比较过滤器,但它用来匹配列限定符而不是行键)
    比较运算符和比较器类型与RowFilter一样

    Filter filter = new QualifierFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("colqual120")));

    4.ValueFilter  值过滤器(提供与行过滤器或限定符相同功能,只是针对的是单元值)

    值过滤器不指定某个列,它会将所有含有某个值的列取出来,混在一起
    Filter filter = new ValueFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryPrefixComparator(Bytes.toBytes("foo"))); //过滤掉所有单元值不是foo开头的列

    5. 时间戳过滤器

    List<Long> timestamps = new ArrayList<Long>();
    timestamps.add(100L);
    timestamps.add(200L);
    Filter filter = new TimeStampsFilter(timestamps);

    6. SingleColumnValueFilter(影响查询性能,在处理大量数据的时候速度可能会慢)

    过滤某列值大于多少小于多少:

    List<Filter> filters = new ArrayList<Filter>(); 
    filters.add( new SingleColumnValueFilter(Bytes.toBytes("pinfo"), //列族
    Bytes.toBytes("t"), //列名    
    CompareOp.GREATER,Bytes.toBytes("1359901"]) ) //
    filters.add( new SingleColumnValueFilter(Bytes.toBytes("pinfo"), 
    Bytes.toBytes("t"),    
    CompareOp.LESS,Bytes.toBytes("1389901"]) )    
    FilterList filterList1 = new FilterList(Operator.MUST_PASS_ALL,filters); 
    sn.setFilter(filterList1);

    7. 过滤器列表

  • 相关阅读:
    这篇文章把短线操作技巧以及交易原则讲透了!
    炒股老手的妙招——卖出在周K线的顶部
    连续多阳低吸买入法需要哪些条件?
    2个实盘案例带你了解南玻量态选庄股法!
    如何通过筹码分布判断一个股票要不要做?
    股票指标公式高手是怎么通过指标变现的?
    股票回踩均线是什么意思?
    定宽不定宽盒子的居中解决办法和外边距塌陷问题
    JS 数据类型
    JS 事件总结
  • 原文地址:https://www.cnblogs.com/gnivor/p/5025418.html
Copyright © 2011-2022 走看看