IDEA代码操作Hbase(2)----程序案例

IDEA代码操作Hbase(2)----程序案例

电信数据

		用户mdn			    进入时间	   离开时间      地区编号    经纬度
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503211049,20180503210349,8320113,118.908,32
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503200139,20180503194939,8320211,120.433,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503221114,20180503220114,8340122,117.403,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503174337,20180503174255,8310104,121.443,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503111910,20180503111010,8320202,120.308,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503194724,20180503194124,8320506,120.683,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503090021,20180503085621,8340102,117.403,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503111053,20180503105953,8320206,120.158,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503101914,20180503101514,8321112,119.288,32
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503215631,20180503215331,8340181,117.818,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503111508,20180503111108,8320204,120.293,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503095753,20180503094853,8320114,118.798,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503224430,20180503223930,8340104,117.203,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503203049,20180503201849,8320404,119.928,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503110626,20180503110326,8320402,120.003,31
...
...51万行

一个用户会有很多记录

需求:提供用户的mdn,以进入时间为准,获取用户最新的三个位置(经纬度)

package com.shujia;

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 Demo03DianXin {
    Connection conn;
    TableName dianXin;

    @Before
    public void init() throws IOException {
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", "master:2181,node1:2181,node2:2181");
        conn = ConnectionFactory.createConnection(conf);
        dianXin = TableName.valueOf("dianXin");
    }

    @Test
    // 建表
    public void createTable() throws IOException {
        //操作表结构,需要调取getAdmin()方法
        Admin admin = conn.getAdmin();
        //判断表是否存在
        if (!admin.tableExists(dianXin)) {
            admin.createTable(new HTableDescriptor(dianXin)//创建表,指定表名为dianxin
                    .addFamily(new HColumnDescriptor("cf1")//添加一个列簇,列簇名为 cf1
                            .setMaxVersions(5)));//设置版本为5个
        } else {
            System.out.println("表已经存在!");
        }
    }

    @Test
    //加载数据,将数据写入HBase
    public void putALL() throws IOException {
        //操作数据,需要调取getTable()方法
        Table dx_tb = conn.getTable(dianXin);
        //new一个ArrayList作为批量插入使用
        ArrayList<Put> puts = new ArrayList<>();
        int cnt = 0;
        int batchSize = 1000;

        BufferedReader br = new BufferedReader(new FileReader("data/DIANXIN.csv"));
        //切分
        String line;
        while ((line = br.readLine()) != null) {
            String[] split = line.split(",");
            String mdn = split[0];
            String start_time = split[1];//进入时间
            String lg = split[4];//经度
            String lat = split[5];//纬度

            //加载数据到表
            Put put = new Put(mdn.getBytes());//创建Put对象,指定rk=mdn
            //插入数据需指定列簇名、列名,将进入时间、经纬度的数据插入进去(时间需要转化为时间戳)
            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);
            cnt += 1;//存放一条,cnt就会加1
            if (cnt == batchSize) {//每1000条插入一次到表里
                dx_tb.put(puts);//当cnt=batchSize=1000的时候,将集合里的数据加载到表里
                puts.clear();//集合是数据加载一次后,然后清空
                cnt = 0;//插入一次后,cnt置零
            }
        }
        // 判断Put的List是否为空,不为空的话再插入一次
        if (!puts.isEmpty()) {
            dx_tb.put(puts);
        }
        br.close();
    }

    @Test
    // 根据mdn获取用户最新的3个位置
    public void getPositionByMdn() throws IOException {
        //操作数据,需要调取getTable()方法
        Table dx_tb = conn.getTable(dianXin);
        //指定用户的mdn,用变量接收一下(用户的mdn就是表里的rk)
        String mdn = "48049101CE9FC280703582E667DE3F3D947ABD37";

        //new一个Get,用来获取表里的数据
        Get get = new Get(mdn.getBytes());
        get.setMaxVersions(3);//设置多版本为3,获得最新的3条数据
        Result rs = dx_tb.get(get);//使用操作表的变量来获取数据

        ArrayList<String> lgArr = new ArrayList<>();//new一个集合用来存经度
        ArrayList<String> latArr = new ArrayList<>();//new一个集合用来存纬度

        for (Cell cell : rs.listCells()) {
            //使用CellUtil()来获取value,并转化为String类型
            String value = Bytes.toString(CellUtil.cloneValue(cell));
            if ("lg".equals(Bytes.toString(CellUtil.cloneQualifier(cell)))) {
                lgArr.add(value); //如果value是经度的话,就添加到经度集合里
            } else if ("lat".equals(Bytes.toString(CellUtil.cloneQualifier(cell)))) {
                latArr.add(value);//如果value是经度的话,就添加到纬度集合里
            }
        }

        //遍历经度和纬度集合
        for (int i = 0; i < 3; i++) {
            System.out.println(lgArr.get(i) + "," + latArr.get(i));
        }
    }

    @After
    public void close() throws IOException {
        conn.close();
    }
}
posted @   阿伟宝座  阅读(173)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示