A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一。Java Api
头部代码

public class FamilyFilterDemo  {

    private static boolean isok = false;
    private static String tableName = "test";
    private static String[] cfs = new String[]{"f1","f2"};
    private static String[] data = new String[]{"row-1:f1:c1:v1", "row-2:f1:c2:v2", "row-3:f2:c3:v3", "row-4:f2:c4:v4"};

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

        MyBase myBase = new MyBase();
        Connection connection = myBase.createConnection();
        if (isok) {
            myBase.deleteTable(connection, tableName);
            myBase.createTable(connection, tableName, cfs);
            myBase.putRows(connection, tableName, data); // 造数据
        }
        Table table = connection.getTable(TableName.valueOf(tableName));
        Scan scan = new Scan();
中部代码
向右滑动滚动条可查看输出结果。

1. BinaryComparator 构造过滤器
        FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("f1"))); // [row-1, row-2]
        FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("f1"))); // [row-3, row-4]
        FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.GREATER, new BinaryComparator(Bytes.toBytes("f1"))); // [row-3, row-4]
        FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL, new BinaryComparator(Bytes.toBytes("f1"))); // [row-1, row-2, row-3, row-4]
        FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.LESS, new BinaryComparator(Bytes.toBytes("f2"))); // [row-1, row-2]
        FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("f1"))); // [row-1, row-2]
2. BinaryPrefixComparator 构造过滤器
        FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("f1"))); // [row-1, row-2]
        FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("f1"))); // [row-3, row-4]
        FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.GREATER, new BinaryComparator(Bytes.toBytes("f1"))); // [row-3, row-4]
        FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL, new BinaryComparator(Bytes.toBytes("f1"))); // [row-1, row-2, row-3, row-4]
        FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.LESS, new BinaryComparator(Bytes.toBytes("f2"))); // [row-1, row-2]
        FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("f1"))); // [row-1, row-2]
3. SubstringComparator 构造过滤器
        FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("1")); // [row-1, row-2]
        FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.NOT_EQUAL, new SubstringComparator("f")); // []
4. RegexStringComparator 构造过滤器
        FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.NOT_EQUAL, new RegexStringComparator("f")); // []
        FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("f")); // [row-1, row-2, row-3, row-4]
        FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("2")); // [row-3, row-4]
尾部代码

        scan.setFilter(familyFilter);
        ResultScanner scanner = table.getScanner(scan);
        Iterator<Result> iterator = scanner.iterator();
        LinkedList<String> rowkeys = new LinkedList<>();
        while (iterator.hasNext()) {
            Result result = iterator.next();
            String rowkey = Bytes.toString(result.getRow());
            rowkeys.add(rowkey);
        }
        System.out.println(rowkeys);
        scanner.close();
        table.close();
        connection.close();
    }
}
二。Shell Api
1. BinaryComparator 构造过滤器
方式一:

hbase(main):002:0> scan 'test',{FILTER=>"FamilyFilter(=,'binary:f1')"}
ROW                                              COLUMN+CELL
row-1                                           column=f1:c1, timestamp=1588834369334, value=v1
row-2                                           column=f1:c2, timestamp=1588834369334, value=v2
2 row(s) in 0.1000 seconds
支持的比较运算符:= != > >= < <=,不再一一举例。

方式二:

import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.BinaryComparator
import org.apache.hadoop.hbase.filter.FamilyFilter

hbase(main):006:0> scan 'test',{FILTER => FamilyFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'), BinaryComparator.new(Bytes.toBytes('f1')))}
ROW                                              COLUMN+CELL
row-1                                           column=f1:c1, timestamp=1588834369334, value=v1
row-2                                           column=f1:c2, timestamp=1588834369334, value=v2
2 row(s) in 0.0350 seconds
支持的比较运算符:LESS、LESS_OR_EQUAL、EQUAL、NOT_EQUAL、GREATER、GREATER_OR_EQUAL,不再一一举例。

推荐使用方式一,更简洁方便。

2. BinaryPrefixComparator 构造过滤器
方式一:

hbase(main):007:0> scan 'test',{FILTER=>"FamilyFilter(=,'binaryprefix:f1')"}
ROW                                              COLUMN+CELL
row-1                                           column=f1:c1, timestamp=1588834369334, value=v1
row-2                                           column=f1:c2, timestamp=1588834369334, value=v2
2 row(s) in 0.0600 seconds
方式二:

import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.BinaryPrefixComparator
import org.apache.hadoop.hbase.filter.FamilyFilter

hbase(main):011:0>  scan 'test',{FILTER => FamilyFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'), BinaryPrefixComparator.new(Bytes.toBytes('f1')))}
ROW                                              COLUMN+CELL
row-1                                           column=f1:c1, timestamp=1588834369334, value=v1
row-2                                           column=f1:c2, timestamp=1588834369334, value=v2
2 row(s) in 0.0290 seconds
其它同上。

3. SubstringComparator 构造过滤器
方式一:

hbase(main):012:0> scan 'test',{FILTER=>"FamilyFilter(=,'substring:f1')"}
ROW                                              COLUMN+CELL
row-1                                           column=f1:c1, timestamp=1588834369334, value=v1
row-2                                           column=f1:c2, timestamp=1588834369334, value=v2
2 row(s) in 0.0400 seconds
方式二:

import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.SubstringComparator
import org.apache.hadoop.hbase.filter.FamilyFilter

hbase(main):016:0> scan 'test',{FILTER => FamilyFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'), SubstringComparator.new('f1'))}
ROW                                              COLUMN+CELL
row-1                                           column=f1:c1, timestamp=1588834369334, value=v1
row-2                                           column=f1:c2, timestamp=1588834369334, value=v2
2 row(s) in 0.0330 seconds
区别于上的是这里直接传入字符串进行比较,且只支持EQUAL和NOT_EQUAL两种比较符。

4. RegexStringComparator 构造过滤器
import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.RegexStringComparator
import org.apache.hadoop.hbase.filter.FamilyFilter

hbase(main):018:0> scan 'test',{FILTER => FamilyFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'), RegexStringComparator.new('f'))}
ROW                                              COLUMN+CELL
row-1                                           column=f1:c1, timestamp=1588834369334, value=v1
row-2                                           column=f1:c2, timestamp=1588834369334, value=v2
row-3                                           column=f2:c3, timestamp=1588834369334, value=v3
row-4                                           column=f2:c4, timestamp=1588834369334, value=v4
4 row(s) in 0.0600 seconds
该比较器直接传入字符串进行比较,且只支持EQUAL和NOT_EQUAL两种比较符。若想使用第一种方式可以传入regexstring试一下,我的版本有点低暂时不支持,不再演示了。

注意这里的正则匹配指包含关系,对应底层find()方法。

FamilyFilter 不支持使用LongComparator比较器,且BitComparator、NullComparator 比较器用之甚少,也不再介绍。

查看文章全部源代码请访以下GitHub地址:

https://github.com/zhoupengbo/de ... milyFilterDemo.java

1 个回复

倒序浏览
更多讯息欢迎添加小优:DKA-2018
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马