当数据插入到hbase中,可以进行查询,查询方式可以分为两种,一个scan,一个startRow和stopRow,两种方式最好是使用startRow,因为,这种查询块,而本篇先讲述scan遍历方式,主要是是结合Filter过滤器
一、先引入工具类HBaseFilterUtil
HBaseFilterUtil是分装了各种过滤器,不过都是值过滤器,有大于小于的,有过滤器链的,也有包含and和or条件的
具体的代码在本文后面,
二、test测试类
public class Test1 {
public static void main(String[] args) throws IOException {
Connection connection = ConnectionFactory.createConnection(Constant.hBaseConfiguration);
Table table = connection.getTable(TableName.valueOf("ns_telecom:calllog"));
//04----06
// String startStr = "04";
Scan scan = new Scan();
//指的是大于4月的,包括四月
Filter filter1 = HBaseFilterUtil.gteqFilter("f1", "buildTime", Bytes.toBytes("2017-04"));
//值的是下于七月的,不包括七月
Filter filter2 = HBaseFilterUtil.lteqFilter("f1", "buildTime", Bytes.toBytes("2017-07"));
//设置过滤器链,而且关系是and的,
Filter filter = HBaseFilterUtil.andFilter(filter1, filter2);
scan.setFilter(filter);
ResultScanner results = table.getScanner(scan);
for (Result result : results) {
System.out.println(Bytes.toString(result.getRow()));
}
}
}
HBaseFilterUtil
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.util.Collection;
public class HBaseFilterUtil {
/**
* 获得相等过滤器。相当于SQL的 [字段] = [值]
*
* @param cf 列族名
* @param col 列名
* @param val 值
* @return 过滤器
*/
public static Filter eqFilter(String cf, String col, byte[] val) {
SingleColumnValueFilter f = new SingleColumnValueFilter(Bytes.toBytes(cf), Bytes.toBytes(col), CompareFilter.CompareOp.EQUAL, val);
f.setLatestVersionOnly(true);
f.setFilterIfMissing(true);
return f;
}
/**
* 获得大于过滤器。相当于SQL的 [字段] > [值]
*
* @param cf 列族名
* @param col 列名
* @param val 值
* @return 过滤器
*/
public static Filter gtFilter(String cf, String col, byte[] val) {
SingleColumnValueFilter f = new SingleColumnValueFilter(Bytes.toBytes(cf), Bytes.toBytes(col), CompareFilter.CompareOp.GREATER, val);
f.setLatestVersionOnly(true);
f.setFilterIfMissing(true);
return f;
}
/**
* 获得大于等于过滤器。相当于SQL的 [字段] >= [值]
*
* @param cf 列族名
* @param col 列名
* @param val 值
* @return 过滤器
*/
public static Filter gteqFilter(String cf, String col, byte[] val) {
SingleColumnValueFilter f = new SingleColumnValueFilter(Bytes.toBytes(cf), Bytes.toBytes(col), CompareFilter.CompareOp.GREATER_OR_EQUAL, val);
f.setLatestVersionOnly(true);
f.setFilterIfMissing(true);
return f;
}
/**
* 获得小于过滤器。相当于SQL的 [字段] < [值]
*
* @param cf 列族名
* @param col 列名
* @param val 值
* @return 过滤器
*/
public static Filter ltFilter(String cf, String col, byte[] val) {
SingleColumnValueFilter f = new SingleColumnValueFilter(Bytes.toBytes(cf), Bytes.toBytes(col), CompareFilter.CompareOp.LESS, val);
f.setLatestVersionOnly(true);
f.setFilterIfMissing(true);
return f;
}
/**
* 获得小于等于过滤器。相当于SQL的 [字段] <= [值]
*
* @param cf 列族名
* @param col 列名
* @param val 值
* @return 过滤器
*/
public static Filter lteqFilter(String cf, String col, byte[] val) {
SingleColumnValueFilter f = new SingleColumnValueFilter(Bytes.toBytes(cf), Bytes.toBytes(col), CompareFilter.CompareOp.LESS_OR_EQUAL, val);
f.setLatestVersionOnly(true);
f.setFilterIfMissing(true);
return f;
}
/**
* 获得不等于过滤器。相当于SQL的 [字段] != [值]
*
* @param cf 列族名
* @param col 列名
* @param val 值
* @return 过滤器
*/
public static Filter neqFilter(String cf, String col, byte[] val) {
SingleColumnValueFilter f = new SingleColumnValueFilter(Bytes.toBytes(cf), Bytes.toBytes(col), CompareFilter.CompareOp.NOT_EQUAL, val);
f.setLatestVersionOnly(true);
f.setFilterIfMissing(true);
return f;
}
/**
* 和过滤器 相当于SQL的 的 and
*
* @param filters 多个过滤器
* @return 过滤器
*/
public static Filter andFilter(Filter... filters) {
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
if (filters != null && filters.length > 0) {
if (filters.length > 1) {
for (Filter f : filters) {
filterList.addFilter(f);
}
}
if (filters.length == 1) {
return filters[0];
}
}
return filterList;
}
/**
* 和过滤器 相当于SQL的 的 and
*
* @param filters 多个过滤器
* @return 过滤器
*/
public static Filter andFilter(Collection<Filter> filters) {
return andFilter(filters.toArray(new Filter[0]));
}
/**
* 或过滤器 相当于SQL的 or
*
* @param filters 多个过滤器
* @return 过滤器
*/
public static Filter orFilter(Filter... filters) {
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);
if (filters != null && filters.length > 0) {
for (Filter f : filters) {
filterList.addFilter(f);
}
}
return filterList;
}
/**
* 或过滤器 相当于SQL的 or
*
* @param filters 多个过滤器
* @return 过滤器
*/
public static Filter orFilter(Collection<Filter> filters) {
return orFilter(filters.toArray(new Filter[0]));
}
/**
* 非空过滤器 相当于SQL的 is not null
*
* @param cf 列族
* @param col 列
* @return 过滤器
*/
public static Filter notNullFilter(String cf, String col) {
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(cf), Bytes.toBytes(col), CompareFilter.CompareOp.NOT_EQUAL, new NullComparator());
filter.setFilterIfMissing(true);
filter.setLatestVersionOnly(true);
return filter;
}
/**
* 空过滤器 相当于SQL的 is null
*
* @param cf 列族
* @param col 列
* @return 过滤器
*/
public static Filter nullFilter(String cf, String col) {
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(cf), Bytes.toBytes(col), CompareFilter.CompareOp.EQUAL, new NullComparator());
filter.setFilterIfMissing(false);
filter.setLatestVersionOnly(true);
return filter;
}
/**
* 子字符串过滤器 相当于SQL的 like '%[val]%'
*
* @param cf 列族
* @param col 列
* @param sub 子字符串
* @return 过滤器
*/
public static Filter subStringFilter(String cf, String col, String sub) {
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(cf), Bytes.toBytes(col), CompareFilter.CompareOp.EQUAL, new SubstringComparator(sub));
filter.setFilterIfMissing(true);
filter.setLatestVersionOnly(true);
return filter;
}
/**
* 正则过滤器 相当于SQL的 rlike '[regex]'
*
* @param cf 列族
* @param col 列
* @param regex 正则表达式
* @return 过滤器
*/
public static Filter regexFilter(String cf, String col, String regex) {
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(cf), Bytes.toBytes(col), CompareFilter.CompareOp.EQUAL, new RegexStringComparator(regex));
filter.setFilterIfMissing(true);
filter.setLatestVersionOnly(true);
return filter;
}
}