- rowkey过滤器
RowFilter 实现行键字符串的比较和过滤
PrefixFilter rowkey前缀过滤器
KeyOnlyFilter 只对单元格的键进行过滤和显示,不显示值
FirstKeyOnlyFilter 只扫描显示相同键的第一个单元格,其键值对会显示出来
InclusiveStopFilter 替代 ENDROW 返回终止条件行
- 列过滤器
FamilyFilter 列簇过滤器
QualifierFilter 列标识过滤器,只显示对应列名的数据
ColumnPrefixFilter 对列名称的前缀进行过滤
MultipleColumnPrefixFilter 可以指定多个前缀对列名称过滤
ColumnRangeFilter 过滤列名称的范围
- 值过滤器
ValueFilter 值过滤器,找到符合值条件的键值对
SingleColumnValueFilter 在指定的列蔟和列中进行比较的值过滤器
SingleColumnValueExcludeFilter 排除匹配成功的值
- 其他过滤器
ColumnPaginationFilter 对一行的所有列分页,只返回 [offset,offset+limit] 范围内的列
PageFilter 对显示结果按行进行分页显示
TimestampsFilter 时间戳过滤,支持等值,可以设置多个时间戳
ColumnCountGetFilter 限制每个逻辑行返回键值对的个数,在 get 方法中使用
DependentColumnFilter 允许用户指定一个参考列或引用列来过滤其他列的过滤器
Hbase的过滤器API:
/**
* 过滤器扫描(返回过滤器指定条件的记录,即类似于搜索功能) --- 精准匹配/模糊
* @param cf 列族
* @param initValues map记录需要设定值的列和对应值进行过滤数据,例如:{(cmd,delete),(dir,xxx)} ---注意:时间是给定了timeStart + timeStop俩个键值来划定时间范围的
* 时间的格式是 例:2022-05-26 12:10:44 -> 20220526121044 (hbase的time存储格式)
* @param showColumns 向外展示的列 例如只展示 {dir,user}
* @param isAccurate 初始值为true,表示进行精准查询,为false则表示模糊查询
* @throws IOException
*/
public static void filterScan(String cf, Map<String,String> initValues ,ArrayList<String> showColumns ,boolean isAccurate) throws IOException {
ArrayList<JSONObject> results = new ArrayList<JSONObject>();
try {
ArrayList<Filter> filters = new ArrayList<Filter>();
//1、过滤rowKey--(排除预分区的随机数影响)+rowKey设计方式
String rowKeyRegex = getRowKeyRegex(initValues.get(HBASE_HDFSAUDITLOG_COLUMN_DIR));
String regexRowKey="^0{2}[01]\\d{1}"+rowKeyRegex+".*";
RowFilter rowFilter = new RowFilter(CompareOperator.EQUAL, new RegexStringComparator(regexRowKey));
filters.add(rowFilter);
//2、根据用户选定对应列的值对数据进行筛选(cluster=xxx,dir=xxx,)
Iterator<String> keyIt = initValues.keySet().iterator();
String key=keyIt.next();
while (key !=null){
if (key.equals("timeStart")){
filters.add(new SingleColumnValueFilter(Bytes.toBytes(cf),
Bytes.toBytes(key),
CompareOperator.GREATER_OR_EQUAL,
Bytes.toBytes(initValues.getOrDefault(key,"默认值???--默认7天数据还是所有? 系统获取时间"))));
}else if(key.equals("timeStop")){
filters.add(new SingleColumnValueFilter(Bytes.toBytes(cf),
Bytes.toBytes(key),
CompareOperator.LESS_OR_EQUAL,
Bytes.toBytes(initValues.getOrDefault(key,"默认值???--默认7天数据还是所有? 系统获取时间"))));
}
if (isAccurate == false && key.equals(HBASE_HDFSAUDITLOG_COLUMN_DIR)){
//处理模糊查询 -- 针对hbase的dir (/a/b/c --> 包含该路径的所有路径:regex)
filters.add(new SingleColumnValueFilter(Bytes.toBytes(cf),
Bytes.toBytes(key),
CompareOperator.EQUAL,
new RegexStringComparator("^"+key+".*")
));
}else {
filters.add(new SingleColumnValueFilter(Bytes.toBytes(cf),
Bytes.toBytes(key),
CompareOperator.EQUAL,
Bytes.toBytes(initValues.get(key))));
}
key=keyIt.next();
}
Java-API 官方地址:Apache HBase 3.0.0-alpha-3-SNAPSHOT API
参考文章:HBase的JavaAPI使用--进阶篇--过滤器的使用_wx602610c6448b8的技术博客_51CTO博客
Hbase过滤器_it噩梦的博客-CSDN博客_hbase过滤器
重点参考:https://blog.csdn.net/godlovedaniel/article/details/104600637