day 50 hbase java连接


I know, i know
地球另一端有你陪我




一、java api

package day50;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Demo2API {

    Connection conn;
    Admin admin;

    @Before
    public void Conn() throws IOException {

        Configuration conf = HBaseConfiguration.create();

        // 配置ZK的地址,通过ZK可以找到HBase
        conf.set("hbase.zookeeper.quorum"
                ,"master:2181,node1:2181,node2:2181");

        // 创建连接
        conn = ConnectionFactory.createConnection(conf);

        // 关键
        // 3、如果需要对表结构操作 则getAdmin 建表,删除表,修改列簇等等
        //    对数据进行操作,则getTable 查表等等
        admin = conn.getAdmin();
    }
    

    @Test
    // 建表
    public void createTable() throws IOException {

        // 表格描述
        HTableDescriptor htd
                = new HTableDescriptor(TableName.valueOf("javatest2"));
        // 列簇描述
        HColumnDescriptor cf1 = new HColumnDescriptor("cf1");

        // 先添加列簇再建表
        htd.addFamily(cf1);
        admin.createTable(htd);
    }
    

    @Test
    //删除表
    public void deleteTable() throws IOException {

        TableName jt2 = TableName.valueOf("javatest2");
        if(admin.tableExists(jt2)){
            // 先disable,再关闭
            admin.disableTable(jt2);
            admin.deleteTable(jt2);
        }
    }
    

    @Test
    //修改表结构(列簇)
    public void changeTable() throws IOException {

        TableName jt2 = TableName.valueOf("javatest2");
        // 获取表原有的结构
        HTableDescriptor htdt = admin.getTableDescriptor(jt2);
        // 在表原有的结构中 修改列簇的数组
        HColumnDescriptor[] cfs = htdt.getColumnFamilies();
        // 遍历表中原有的列簇
        for (HColumnDescriptor cf : cfs) {
            if("cf1".equals(cf.getNameAsString())){
                cf.setMaxVersions(10000);
            }
        }
        // 新增一个列簇
        HColumnDescriptor cf2
                = new HColumnDescriptor("cf2".getBytes());
        htdt.addFamily(cf2);

        // 记得应用修改
        admin.modifyTable(jt2,htdt);
    }


    @Test
    // 列出所有表 list
    public void list() throws IOException {

        TableName[] tableNames = admin.listTableNames();
        for (TableName name : tableNames) {
            System.out.println(name.getNameAsString());
        }
    }


    @Test
    // 插入数据 put
    public void put() throws IOException {

        // 拿到当前要插入的表
        Table jt2 = conn.getTable(TableName.valueOf("javatest2"));

        // 使用put需要一个put对象
        // 相当于一条信息(一组cell)
        Put put = new Put("001".getBytes());

        // 装填cell
        put.addColumn("cf1".getBytes()
                ,"name".getBytes() , "Jams".getBytes());
        put.addColumn("cf1".getBytes()
                ,"age".getBytes() , "23".getBytes());
        put.addColumn("cf1".getBytes()
                ,"id".getBytes() , "10001".getBytes());

        // 发射
        jt2.put(put);
    }


    @Test
    // 获取数据 get
    public void get() throws IOException {

        // 拿到当前要查询的表
        Table jt2 = conn.getTable(TableName.valueOf("javatest2"));

        //选择查询的rowkey
        Get get = new Get("001".getBytes());

        // 获得查询结果
        Result rs = jt2.get(get);

        // 获取rk
        byte[] rk = rs.getRow();
        // 数组没有重写toString
        System.out.println(rk);
        // 特有的字节数组转字符串方法
        System.out.println(Bytes.toString(rk));

        // 获取cell
        byte[] name = rs.getValue("cf1".getBytes(), "name".getBytes());
        System.out.println(name);
        System.out.println(Bytes.toString(name));
    }


    @Test
    // put 读取写入一组数据
    // 学生表信息
    public void putAll() throws IOException {

        Table stus = conn.getTable(TableName.valueOf("students"));


        BufferedReader br = new BufferedReader(
                new FileReader("data/students.txt"));

        // 接收io读取对象
        String line;
        // 凑一波put一把丢
        ArrayList<Put> puts = new ArrayList<Put>();
        //设定一波的大小
        int size = 50;

        while ((line = br.readLine())!= null){

            String[] splits = line.split(",");
            String id = splits[0];
            String name = splits[1];
            String age = splits[2];
            String gender = splits[3];
            String clazz = splits[4];

            Put put = new Put(id.getBytes());
            byte[] cf1 = "cf1".getBytes();
            put.addColumn(cf1,"name".getBytes() ,name.getBytes());
            put.addColumn(cf1,"age".getBytes() ,age.getBytes());
            put.addColumn(cf1,"gender".getBytes() ,gender.getBytes());
            put.addColumn(cf1,"clazz".getBytes() ,clazz.getBytes());


            // 每次put一个太费劲,塞到list里一把put
            puts.add(put);

            if(puts.size()== size){
                stus.put(puts);
                // 记得情况list
                puts.clear();
            }
        }
        // 循环外以防万一不被整除,还有残留,最后抖一下
        if(!puts.isEmpty()){
            stus.put(puts);
        }

        // 关闭流
        br.close();
    }


    @Test
    // 获取一组数据 scan
    public void scan() throws IOException {

        Table stus
                = conn.getTable(TableName.valueOf("students"));

        Scan scan = new Scan();
        scan.withStartRow("1500100100".getBytes());
        scan.withStopRow("1500100111".getBytes());
        scan.setLimit(10);


        for (Result rs : stus.getScanner(scan)) {

            String id = Bytes.toString(rs.getRow());

            String name = Bytes.toString(
                    rs.getValue("cf1".getBytes(), "name".getBytes()));

            String age = Bytes.toString(
                    rs.getValue("cf1".getBytes(), "age".getBytes()));

            String gender = Bytes.toString(
                    rs.getValue("cf1".getBytes(), "gender".getBytes()));

            String clazz = Bytes.toString(
                    rs.getValue("cf1".getBytes(), "clazz".getBytes()));

            System.out.println(id 
            + "," + name + "," + age + "," + gender + "," + clazz);

            stus.close();
        }
    }


    @Test
    // CellUtil
    public void cellUtil() throws IOException {

        Table stus = conn.getTable(TableName.valueOf("students"));

        // scan可以指定rowkey的范围进行查询,或者是限制返回的条数
        Scan scan = new Scan();
        scan.withStartRow("1500100990".getBytes());

        for (Result rs : stus.getScanner(scan)) {

            String id = Bytes.toString(rs.getRow());
            System.out.print(id + " ");

            // 将一条数据的所有相关联的cell列举出来,可以跨列簇
            // 使用CellUtil从每一个cell中取出数据
            // 不需要考虑每条数据的结构

            for (Cell cell : rs.listCells()) {
                // cell工具类中的转换

                //System.out.print("    ***" + cell + "***    ");
                String value = Bytes.toString(CellUtil.cloneValue(cell));
                System.out.print(value + " ");
            }

            System.out.println();
        }
    }

    @After
    public void close() throws IOException {
        admin.close();
        conn.close();
    }
}

二、一个小小需求

package day50;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class Demo3DianXin {

    /*
     *  1、建表dianxin
     *  2、将数据写入HBase
     *  3、需求:根据用户mdn,查询用户最新的3个位置记录(经纬度)
     */

    Connection conn;
    Admin admin;
    TableName dianxinTN;


    @Before
    public void before() throws IOException {

        // 1、创建一个配置文件
        Configuration conf = HBaseConfiguration.create();
        // 配置ZK的地址,通过ZK可以找到HBase
        conf.set("hbase.zookeeper.quorum"
        , "master:2181,node1:2181,node2:2181");

        // 2、创建连接
        conn = ConnectionFactory.createConnection(conf);

        // 3、创建Admin对象
        admin = conn.getAdmin();
        dianxinTN = TableName.valueOf("dianxin");
    }

    @Test
    // 建表 dianxin cf1

    public void createDianXinTable() throws IOException {
        // 判断表存不存在,不存在则创建
        if (!admin.tableExists(dianxinTN)) {

            // 链式编程
            admin.createTable(new HTableDescriptor(dianxinTN)
                    .addFamily(new HColumnDescriptor("cf1")
                            .setMaxVersions(5)));
        } else {
            System.out.println("表已经存在");
        }
    }

    @Test
    /**
     * 插入数据
     */
    public void putAll() throws IOException {
        Table dianxin = conn.getTable(dianxinTN);

        BufferedReader br
                = new BufferedReader(
                        new FileReader("data/DIANXIN.csv"));

        String line;

        int batchSize = 1000;
        ArrayList<Put> puts = new ArrayList<Put>();

        while ((line = br.readLine()) != null) {

            String[] splits = line.split(",");
            String mdn = splits[0];
            String start_time = splits[1];
            String lg = splits[4];
            String lat = splits[5];

            Put put = new Put(mdn.getBytes());

            // 向一个列簇中,传入两个子列
            put.addColumn("cf1".getBytes()
                    , "lg".getBytes()
                    //时间戳
                    , Long.parseLong(start_time)
                    , lg.getBytes());

            put.addColumn("cf1".getBytes()
                    , "lat".getBytes()
                    , Long.parseLong(start_time)
                    , lat.getBytes());

            puts.add(put);

            if (puts.size() == batchSize) {
                dianxin.put(puts);
                puts.clear();
            }
        }

        if (!puts.isEmpty()) {
            dianxin.put(puts);
        }
    }


    @Test
    // 根据mdn 获取该用户最新的3个位置记录
    // 22D3303E585F7E63AAFFF77E61A7A36E74BCE031
    public void getPosition() throws IOException {

        Table dianxin = conn.getTable(dianxinTN);

        String mdn = "22D3303E585F7E63AAFFF77E61A7A36E74BCE031";

        Get get = new Get(mdn.getBytes());
        // 控制显示出的版本号
        get.setMaxVersions(3);

        Result rs = dianxin.get(get);

		// 通过getValue这种方式只能获取到最新的记录
		// String lg = Bytes.toString(
		//         rs.getValue("cf1".getBytes(), "lg".getBytes()));

		// 定义两个ArrayList分别接收经纬度
        ArrayList<String> lgList = new ArrayList<>();
        ArrayList<String> latList = new ArrayList<>();

        for (Cell cell : rs.listCells()) {

            // 获取当前数据的列名
            String c = Bytes.toString(CellUtil.cloneQualifier(cell));

            // 获取value值
            String s = Bytes.toString(CellUtil.cloneValue(cell));

            if("lg".equals(c)){
                lgList.add(s);
            }else if("lat".equals(c)){
                latList.add(s);
            }
        }

        // 由于时间戳自然降序的原因,数据以及有序
        for (int i = 0; i < 3; i++) {
            String lg = lgList.get(i);
            String lat = latList.get(i);
            System.out.println(lg + " " + lat);
        }
    }


    @After
    public void close() throws IOException {
        admin.close();
        conn.close();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值