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. 过滤器列表

  • 相关阅读:
    Junit单元测试
    win7的6个网络命令
    WOJ1024 (POJ1985+POJ2631) Exploration 树/BFS
    WOJ1022 Competition of Programming 贪心 WOJ1023 Division dp
    woj1019 Curriculum Schedule 输入输出 woj1020 Adjacent Difference 排序
    woj1018(HDU4384)KING KONG 循环群
    woj1016 cherry blossom woj1017 Billiard ball 几何
    woj1013 Barcelet 字符串 woj1014 Doraemon's Flashlight 几何
    woj1012 Thingk and Count DP好题
    woj1010 alternate sum 数学 woj1011 Finding Teamates 数学
  • 原文地址:https://www.cnblogs.com/gnivor/p/5025418.html
Copyright © 2011-2022 走看看