小白学hadoop日记16——hbase的java api 2——过滤器、比较器

过滤器:值过滤、单值过滤器、过滤器链、行过滤器、列过滤器等。
比较器:二进制、字符串前缀比较、正则比较器等
能不用过滤器尽量不用过滤器,因为性能肯定没有直接使用get快。

    LESS,
    LESS_OR_EQUAL,
    EQUAL,
    NOT_EQUAL,
    GREATER_OR_EQUAL,
    GREATER,
    NO_OP

代码实现

import com.al.util.HbaseUtil;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.BinaryPrefixComparator;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * FilterList过滤器链:可以存放多个过滤器一起对数据过滤
 *
 * 需求:
 * 1、查询年龄为80,且name为ls开头
 * where age=80 and name like "ls%" or
 *
 * 2、查询年龄为80,或name为ls8开头
 * where age>80 or name like "ls8%"
 */
public class Demo07_FilterList {

    public static void main(String[] args) throws IOException {
        //获取table对象
        Table tb = HbaseUtil.getTable("tb");
        //获取FilterList
        /*
        MUST_PASS_ALL : and
        MUST_PASS_ONE : or
         */
        FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);
        //构造单值过滤器
        /*
        LESS  :  <
        LESS_OR_EQUAL : <=
        EQUAL : =
        NOT_EQUAL : !=
        GREATER_OR_EQUAL : >=
        GREATER : >
        NO_OP : 不比较
         */
        /*SingleColumnValueFilter ageFilter = new SingleColumnValueFilter(Bytes.toBytes("data"),
                Bytes.toBytes("age"),
                CompareFilter.CompareOp.EQUAL,
                Bytes.toBytes("80"));
        SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("data"),
                Bytes.toBytes("name"),
                CompareFilter.CompareOp.EQUAL,
                new BinaryPrefixComparator(Bytes.toBytes("ls")));*/
        //查询年龄为80,或name为ls8开头
        SingleColumnValueFilter ageFilter = new SingleColumnValueFilter(Bytes.toBytes("data"),
                Bytes.toBytes("age"),
                CompareFilter.CompareOp.GREATER_OR_EQUAL,
                Bytes.toBytes("80"));
        SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("data"),
                Bytes.toBytes("name"),
                CompareFilter.CompareOp.EQUAL,
                new BinaryPrefixComparator(Bytes.toBytes("ls8")));
        //将过滤器放入链中
        filterList.addFilter(ageFilter);
        filterList.addFilter(nameFilter);
        //在使用scan中添加过滤器
        Scan scan = new Scan();
        scan.setFilter(filterList);
        //提交scan查询
        ResultScanner scanner = tb.getScanner(scan);
        //打印
        HbaseUtil.scanData(scanner,null);
        //关闭table
        HbaseUtil.close(null,tb);
    }
}

​

比较器:

import com.al.util.HbaseUtil;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * 比较器:
 */
public class Demo08_Compator {

    public static void main(String[] args) throws IOException {

        //获取table对象
        Table tb = HbaseUtil.getTable("tb");

        //查询年龄为80,或name为ls8开头
        SingleColumnValueFilter ageFilter1 = new SingleColumnValueFilter(Bytes.toBytes("data"),
                Bytes.toBytes("age"),
                CompareFilter.CompareOp.GREATER_OR_EQUAL,
                Bytes.toBytes("80"));

        //字节比较器
        SingleColumnValueFilter ageFilter2 = new SingleColumnValueFilter(Bytes.toBytes("data"),
                Bytes.toBytes("age"),
                CompareFilter.CompareOp.EQUAL,
                new BinaryComparator(Bytes.toBytes("80")));

        //字节前缀比较器
        SingleColumnValueFilter ageFilter3 = new SingleColumnValueFilter(Bytes.toBytes("data"),
                Bytes.toBytes("age"),
                CompareFilter.CompareOp.EQUAL,
                new BinaryPrefixComparator(Bytes.toBytes("8")));

        //子字符串比较器  SubstringComparator("12")这个值是列值的一个子字符串即可
        SingleColumnValueFilter ageFilter4 = new SingleColumnValueFilter(Bytes.toBytes("data"),
                Bytes.toBytes("age"),
                CompareFilter.CompareOp.EQUAL,
                new SubstringComparator("12"));
        //12 120 121 122 123 124 125 126 ... 129  112

        SingleColumnValueFilter ageFilter5 = new SingleColumnValueFilter(Bytes.toBytes("data"),
                Bytes.toBytes("age"),
                CompareFilter.CompareOp.EQUAL,
                new RegexStringComparator("^[1-2].*$"));

        //在使用scan中添加过滤器
        Scan scan = new Scan();
        scan.setFilter(ageFilter5);

        //提交scan查询
        ResultScanner scanner = tb.getScanner(scan);

        //打印
        HbaseUtil.scanData(scanner,null);

        //关闭table
        HbaseUtil.close(null,tb);
    }
}

列比较器

import com.al.util.HbaseUtil;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * 列比较器
 */
public class Demo09_Qualilfire {

    public static void main(String[] args) throws IOException {

        //获取table对象
        Table tb = HbaseUtil.getTable("tb");

        //根据列的名称来过滤
        QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.GREATER,
                new BinaryComparator(Bytes.toBytes("rst")));

        QualifierFilter qualifierFilter1 = new QualifierFilter(CompareFilter.CompareOp.EQUAL,
                new SubstringComparator("a"));

        //在使用scan中添加过滤器
        Scan scan = new Scan();
        scan.setFilter(qualifierFilter1);

        //提交scan查询
        ResultScanner scanner = tb.getScanner(scan);

        //打印
        HbaseUtil.scanData(scanner,null);

        //关闭table
        HbaseUtil.close(null,tb);
    }
}

 行过滤器

import com.al.util.HbaseUtil;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
/**
 * 行过滤器
 */
public class Demo10_RowFilter {
    public static void main(String[] args) throws IOException {
        //获取table对象
        Table tb = HbaseUtil.getTable("tb");
        //使用rowkey中的值来进行过滤
        RowFilter ls8 = new RowFilter(CompareFilter.CompareOp.EQUAL,
                new BinaryPrefixComparator(Bytes.toBytes("rk8")));
        //在使用scan中添加过滤器
        Scan scan = new Scan();
        scan.setFilter(ls8);
        //提交scan查询
        ResultScanner scanner = tb.getScanner(scan);
        //打印
        HbaseUtil.scanData(scanner,null);
        //关闭table
        HbaseUtil.close(null,tb);
    }
}

其他过滤器
FirstKeyOnlyFilter
ColumnRangeFilter  -- 需要起始key,还有是否包含起始key
MultipleColumnPrefixFilter  -- 需要一个二维数组
PageFilter -- 指定查询page的条数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值