hbase2.1.x java scan扫描 作者:马育民 • 2023-01-21 22:33 • 阅读:10062 上接:[hbase2.1.x java 创建工程](https://www.malaoshi.top/show_1IX1wM13t84Y.html "hbase2.1.x java 创建工程") # 说明 本文使用 java api 实现 `scan` 命令 **注意:**该 `scan` 扫描查询非常重要,过滤器都是基于该方式实现的 # 常用方法 - `scan.addFamily()`:返回指定的 family,否则返回所有 - `scan.addColumn()`:返回指定的 family、column,否则返回所有 - **`scan.setFilter()`**:指定 Filter 过滤数据 ### 设置开始rowkey 指定开始的rowkey(包含),如果不设置,则从表头开始 **注意:**`rowKey` 是按ASCII码表升序排列 有下面2个方法: - scan.withStartRow(byte[] startRow, boolean inclusive) - 参数 `inclusive`:若为 `true`,则包含指定的rowkey;若为 `false`,则不包含 - withStartRow(byte[] startRow):第二个参数默认为 `ture` ### 设置截止rowkey 指定结束的rowkey(不包含)。如果不设置,则截止的末尾 **注意:**`rowKey` 是按ASCII码表升序排列 有下面2个方法: - withStopRow(byte[] stopRow, boolean inclusive) - 参数 `inclusive`:若为 `true`,则包含指定的rowkey;若为 `false`,则不包含,**默认为** `false` - withStopRow(byte[] stopRow):第二个参数默认为false # 代码 ### 关键代码 ``` /** * * @param tableName * @param family,返回指定的 family,指定null表示返回所有 * @param column,返回指定的 family、column,指定null表示返回所有 * @param startRow,指定开始的rowkey(包含)。如果不设置,则从表头开始 * @param stopRow,指定结束的rowkey(不包含)。如果不设置,则截止的末尾 * @return * @throws IOException */ public List scan(String tableName, String family, String column,String startRow,String stopRow) 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)); } //执行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; } ``` # 添加测试数据 创建表: ``` create "book","c1" ``` 清空表: ``` truncate 'book' ``` 添加数据: ``` put 'book','1001','c1:title','htlm从入门到放弃' put 'book','1001','c1:author','lucy' put 'book','1001','c1:price','097.50' put 'book','1002','c1:title','css从入门到放弃' put 'book','1002','c1:author','lili' put 'book','1002','c1:price','099.90' put 'book','1003','c1:title','hadoop从入门到放弃' put 'book','1003','c1:author','韩梅梅' put 'book','1003','c1:price','190.00' put 'book','1003','c1:title','hbase从入门到精通' put 'book','1003','c1:author','李雷' put 'book','1003','c1:price','029.50' ``` ### 测试 ``` public static void main(String[] args) throws IOException { HbaseUtils1_scan utils=new HbaseUtils1_scan(); utils.connect(); // 返回 book 中所有列族、列的数据 // List resList = utils.scan("book", null, null, null,null); // 返回 book 中所有c1列族的数据 // List resList = utils.scan("book", "c1", null, null,null); // 返回 book 中所有c1列族、title列的数据 // List resList = utils.scan("book", "c1", "title", null,null); // 返回 book 中所有c1列族、title列,1002(包含) - 1021(不包含)的数据 List resList = utils.scan("book", "c1", "title", "1002","1021"); for(CellData[] arr : resList){ for(CellData item : arr){ System.out.println(item.getFamily()+":"+item.getRowkey()+":"+item.getQualifier() +" == "+item.getValue()); // System.out.print(item.getFamily()+":"+item.getRowkey()+":"+item.getQualifier() +" == "+item.getValue()+"\t\t"); } System.out.println("----------"); } utils.close(); } ``` 参考: https://blog.csdn.net/weixin_39675289/article/details/114173634 https://blog.csdn.net/qq_34009542/article/details/120674233 原文出处:http://malaoshi.top/show_1IX4oz3JW4S7.html