hbase2.1.x java RowFilter rowkey过滤器 作者:马育民 • 2023-01-22 20:06 • 阅读:10112 上接:[hbase2.1.x java 创建工程](https://www.malaoshi.top/show_1IX1wM13t84Y.html "hbase2.1.x java 创建工程") # 说明 `RowFilter` 是用来对 `rowkey` 进行过滤的 ### 比较符 可以使用比较符(不支持符号,需要用英文单词),如下: |Operator|Description| |---|---|---| |LESS|小于| |LESS_OR_EQUAL|小于等于| |EQUAL|等于| |NOT_EQUAL|不等于| |GREATER_OR_EQUAL|大于等于| |GREATER|大于| |NO_OP|排除所有| ### 比较器 参见 [链接](https://www.malaoshi.top/show_1IX4pKTY0Wen.html "链接") # 例子 ### 关键方法 ``` /** * * @param tableName 表名 * @param family 列族名 * @param column 列名 * @param startRow,指定开始的rowkey(包含)。如果不设置,则从表头开始 * @param stopRow,指定结束的rowkey(不包含)。如果不设置,则截止的末尾 * @param op 操作,=,>,>=,<,<=,!= * @param rowComparator 比较器 * @throws IOException */ public List filter( String tableName, String family, String column, String startRow, String stopRow, String op, ByteArrayComparable rowComparator) throws IOException { Table table = conn.getTable(TableName.valueOf(tableName)); //创建Scan Scan scan=new Scan(); // 返回指定的 family、column,不指定表示返回所有 if(column!=null && !"".equals(column)) { scan.addColumn(Bytes.toBytes(family), Bytes.toBytes(column)); } // 返回指定的 family,不指定表示返回所有 if(family!=null && !"".equals(family) && (column==null || "".equals(column))) { scan.addFamily(Bytes.toBytes(family)); } // 指定开始的行(包含)。如果不设置,则从表头开始 if(startRow!=null && !"".equals(startRow)) { scan.withStartRow(Bytes.toBytes(startRow)); } // 指定结束的行(不包含)。如果不设置,则截止的末尾 if(stopRow!=null && !"".equals(stopRow)) { scan.withStopRow(Bytes.toBytes(stopRow)); } RowFilter filter = new RowFilter(getCompareOperator(op),rowComparator); //传入filter scan.setFilter(filter); //执行scan ResultScanner resultScanner = table.getScanner(scan); Iterator iterator = resultScanner.iterator(); List retList = new ArrayList<>(); //迭代,在迭代时,ResultScanner会发送get请求 while(iterator.hasNext()){ Result result=iterator.next(); //获取rowkey String rowkey=Bytes.toString(result.getRow()); // System.out.print(rowkey+"\t"); //获取所有单元格 List list=result.listCells(); CellData[] arr = new CellData[list.size()]; int i = 0; for(Cell item:list){ String familyOfDb=Bytes.toString(CellUtil.cloneFamily(item)); String qualifier=Bytes.toString(CellUtil.cloneQualifier(item)); String valueDb=Bytes.toString(CellUtil.cloneValue(item)); CellData cellData = new CellData(familyOfDb,qualifier,rowkey,item.getTimestamp(),valueDb); arr[i] = cellData ; i ++ ; } retList.add(arr); } //用完要及时关闭,在迭代时,ResultScanner会发送get请求 resultScanner.close(); table.close(); return retList; } ``` ### 比较符号转枚举方法 ``` // 传入 =,>,>=,<,<=,!=,返回相对应的 CompareOperator CompareOperator getCompareOperator(String op){ CompareOperator co = null; switch (op) { case "=": co = CompareOperator.EQUAL; break; case ">": co = CompareOperator.GREATER; break; case ">=": co = CompareOperator.GREATER_OR_EQUAL; break; case "<": co = CompareOperator.LESS; break; case "<=": co = CompareOperator.LESS_OR_EQUAL; break; case "!=": co = CompareOperator.NOT_EQUAL; break; default: co = CompareOperator.NO_OP; } return co; } ``` ### 测试 ``` public static void main(String[] args) throws IOException { HbaseUtils2_RowFilter utils=new HbaseUtils2_RowFilter(); utils.connect("hadoop1,hadoop2,hadoop3","2181"); // XXX 关键:二进制比较器,查询 rowkey 大于 1002 的数据 XXX BinaryComparator comparator = new BinaryComparator(Bytes.toBytes("1002")); List resList = utils.filter("book", "c1", null,null,null, ">", comparator); for(CellData[] arr : resList){ for(CellData item : arr){ System.out.println(item.getFamily()+":"+item.getRowkey()+":"+item.getQualifier() +" == "+item.getValue()); } System.out.println("----------"); } utils.close(); } ``` 原文出处:http://malaoshi.top/show_1IX4pKbwTiGm.html