hbase2.1.x java scan扫描

上接: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<CellData[]> 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<Result> iterator = resultScanner.iterator();
    List<CellData[]> 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<Cell> 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<CellData[]> resList = utils.scan("book", null, null, null,null);
    // 返回 book 中所有c1列族的数据
//    List<CellData[]> resList = utils.scan("book", "c1", null, null,null);
    // 返回 book 中所有c1列族、title列的数据
//    List<CellData[]> resList = utils.scan("book", "c1", "title", null,null);
    // 返回 book 中所有c1列族、title列,1002(包含) - 1021(不包含)的数据
    List<CellData[]> 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


原文出处:https://malaoshi.top/show_1IX4oz3JW4S7.html