Hbase之 java 客户端上 table 数据的获取-get / scan (6)

1 获取表数据/内容入门程序

public class TableDataTest01 {
    public static void main(String[] args) throws IOException {
        // 获取连接对象
        Connection conn = HbaseUtil.getHbaseConnection();

        // 获取一个表操作对象
        Table tb_user = conn.getTable(TableName.valueOf("tb_user"));
        // 获取一行内容
        Get rk001 = new Get(Bytes.toBytes("rk001"));
        // 获取指定的一行数据的多个单元格
        Result result = tb_user.get(rk001);

        // 循环遍历,将这些单元格全部取出来
        while(result.advance()){
            // 获取单元格的数据
            Cell cell = result.current();

            //获取行   列族   属性  属性的值  [单元格]
            byte[] family = CellUtil.cloneFamily(cell);
            byte[] qualifier = CellUtil.cloneQualifier(cell);
            byte[] value = CellUtil.cloneValue(cell);

            if("ages".equals(Bytes.toString(qualifier))){
                System.out.println("rk001"+"->"+Bytes.toString(family)+"->"+Bytes.toString(qualifier)+"->"+Bytes.toInt(value));
            }else {
                System.out.println("rk001"+"->"+Bytes.toString(family)+"->"+Bytes.toString(qualifier)+"->"+Bytes.toString(value));
            }
        }
        // 关闭连接
        tb_user.close();
        conn.close();
    }
}
// 运行后结果如下
rk001->cf->age->18
rk001->cf->job->coder
rk001->cf->name->zss-demeimei
rk001->cf->sal->23k

2 get() 方法获取指定表的数据

public class GetTableData {
    public static void main(String[] args) {
        try {
            // 获取连接对象
            Connection connection = HbaseUtil.getHbaseConnection();
            // 获取一行数据
            getData1(connection);
            // 获取多行数据
            getData2(connection);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
     // 获取一行数据
    public static void getData1(Connection connection){
        try {
            // 获取表操作对象
            Table tbuser = connection.getTable(TableName.valueOf("tb_user"));
            // 创建一个get对象,并获得指定行的数据
            Get get = new Get("rk001".getBytes());
            // 获取一行数据 ,一行数据有很多单元格
            Result result = tbuser.get(get);
            // 调用展示数据方法打印数据
            showData(result);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * get方法获取多行数据
     * @param connection
     */
    public static void getData2(Connection connection){
        try {
            // 获取表的操作对象
            Table tb_user = connection.getTable(TableName.valueOf("tb_user"));
            // 创建一个get对象,获取指定行的数据
            Get get1 = new Get("rk001".getBytes());
            Get get2 = new Get("rk002".getBytes());
            // 创建集合,将多行数据存储在list集合里面
            ArrayList<Get> list = new ArrayList<>();
            // 将获取的多行数据添加到list集合中
            list.add(get1);
            list.add(get2);
            // 获取查询到的多行数据
            Result[] rowResults = tb_user.get(list);
            // 遍历,将数据取出来
            for (Result rowResult : rowResults) {
                showData(rowResult);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    // 展示数据
    public static void showData(Result result){
        if(result != null){
            while (result.advance()){
                // 获取单元格的数据
                Cell cell = result.current();
                // 获取行  列族  属性  属性的值 {单元格}
                byte[] row = CellUtil.cloneRow(cell);
                byte[] family = CellUtil.cloneFamily(cell);
                byte[] qualifier = CellUtil.cloneQualifier(cell);
                byte[] value = CellUtil.cloneValue(cell);
                // 判断如果属性时 age ,就将将其转为整数类型
                if("age".equals(Bytes.toString(qualifier))){
                    System.out.println(
                            Bytes.toString(row)+"->"+
                            Bytes.toString(family)+"->"+
                            Bytes.toString(qualifier)+"->"+
                            Bytes.toInt(value));
                }else {
                    System.out.println(
                            Bytes.toString(row)+"->"+
                            Bytes.toString(family)+"->"+
                            Bytes.toString(qualifier)+"->"+
                            Bytes.toString(value));
                }
            }
        }
    }
}

3 scan() 方法获取指定表的数据

public class GetTableData {
    public static void main(String[] args) {
        try {
            // 获取连接对象
            Connection connection = HbaseUtil.getHbaseConnection();
         
            // 获取指定表的指定列族的数据
            scanColumnFamily(connection);
            // 扫描全表得到指列族定指定属性的数据
            scanColumnFamilyWithQualifier(connection);
            // 扫描全表得到指定列族指定属性指定行范围的数据
            scanFamilyWithQualifierAndValue(connection);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 获取某个列族的数据
     * @param connection
     */
    public static void scanColumnFamily(Connection connection){
        try {
            // 获取指定表对象
            Table tb_user = connection.getTable(TableName.valueOf("tb_user"));
            // 获取指定列族的数据
            ResultScanner scanner = tb_user.getScanner(Bytes.toBytes("cf"));
            Iterator<Result> iterator = scanner.iterator();
            // 遍历数据,将数据取出来
            while (iterator.hasNext()){
                Result next = iterator.next();
                showData(next);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 获取某个列族的某个属性
     * @param connection
     */
    public static void scanColumnFamilyWithQualifier(Connection connection){
        try {
            // 获取指定表
            Table tb_user = connection.getTable(TableName.valueOf("tb_user"));
            // 获得扫描对象
            Scan scan = new Scan();
            // 扫描指定的列族和其属性
            scan.addColumn("cf".getBytes(),"name".getBytes());
            // 指定表对象获取扫描对象指定的所有的数据
            ResultScanner resultScanner = tb_user.getScanner(scan);
            // 获取迭代器对象
            Iterator<Result> iterator = resultScanner.iterator();
            // 遍历迭代器,将所有的数据都取出来
            while (iterator.hasNext()){
                // 获取下一个结果
                Result next = iterator.next();
                showData(next);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 扫描整个表 ,查询指定表指定行的某个属性值
     * @param connection
     */
    public static void scanFamilyWithQualifierAndValue(Connection connection) {

        try {
            //获取table对象
            Table tb_user = connection.getTable(TableName.valueOf("tb_user"));

            // 全表扫描所有的数据
            Scan scan = new Scan();
            scan.withStartRow(Bytes.toBytes("rk002"));      // 包含这行
            scan.withStopRow(Bytes.toBytes("rk005"));       // 不包含这行

            // 指定返回的列族和属性的值
            scan.addColumn("cf".getBytes(),"name".getBytes());

            ResultScanner resultScanner = tb_user.getScanner(scan);

            Iterator<Result> iterator = resultScanner.iterator();
            while (iterator.hasNext()){
                Result result = iterator.next();
                showData(result);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    public static void showData(Result result){
        if(result != null){
            while (result.advance()){
                // 获取单元格的数据
                Cell cell = result.current();
                // 获取行  列族  属性  属性的值 {单元格}
                byte[] row = CellUtil.cloneRow(cell);
                byte[] family = CellUtil.cloneFamily(cell);
                byte[] qualifier = CellUtil.cloneQualifier(cell);
                byte[] value = CellUtil.cloneValue(cell);
                // 判断如果属性时 age ,就将将其转为整数类型
                if("age".equals(Bytes.toString(qualifier))){
                    System.out.println(
                            Bytes.toString(row)+"->"+
                            Bytes.toString(family)+"->"+
                            Bytes.toString(qualifier)+"->"+
                            Bytes.toInt(value));
                }else {
                    System.out.println(
                            Bytes.toString(row)+"->"+
                            Bytes.toString(family)+"->"+
                            Bytes.toString(qualifier)+"->"+
                            Bytes.toString(value));
                }
            }
        }
    }
}

注意 : 获取表数据时 ,能用 get() 方法获取到指定数据就不要用 scan() 方法获取 .

1) get() 方法是确定了行健 ,然后根据行健取出指定的列族 / 属性 / 值进行分析查询 ,通过 rowkey 取值速度快 .

2) scan() 方法是全盘扫描 , 然后根据指定的条件筛选出指定的值 ,因为是要将整个表进行从头到尾的全部扫描 ,所以检索速度慢 ,效率低 (通过过滤器取值速度慢) .

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值