HBASE小练习-根据时间戳求最新的三个位置

该博客介绍了一种处理地理位置数据的方法,通过将数据的制表符替换为逗号,然后利用HBase存储经纬度信息。代码示例展示了如何在Java中创建HBase表,将数据批量写入,并通过md5号码获取最新的三个位置坐标。
摘要由CSDN通过智能技术生成

需求:
拿到的数据样式:(第一列为md5号码,第二列为进出时间,第四列和第五列为人所在的经纬度)
在这里插入图片描述
位置由经纬度确定,也就是说,拿到经纬度也就是拿到了一个人的位置
输入md5号码,根据进出时间来求出最新的三个经纬度

处理:
1、先对数据做一个处理,将所有的空格换成逗号方便后面处理
这里是将数据在shell里面做的转换
cat part-00000|tr “\t” “,” > part-00001
在这里插入图片描述
2、开始写代码

import com.jcraft.jsch.IO;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
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;
import java.util.List;

public class Demo03DianXin {
    Connection conn;
    Admin admin;//对表结构进行操作
    TableName dianxinT = TableName.valueOf("dianxin");
    Table dianxin;//对表中的数据进行操作

    @Before
    public void init() throws Exception{
        HBaseConfiguration conf = new HBaseConfiguration();
        conf.set("hbase.zookeeper.quorum","master,node1,node2");
        conn = ConnectionFactory.createConnection(conf);
        admin = conn.getAdmin();
        dianxin = conn.getTable(dianxinT);
    }

    //创建表
    @Test
    public void createTable() throws Exception{
        if (!admin.tableExists(dianxinT)){
            HTableDescriptor dianxin = new HTableDescriptor(TableName.valueOf("dianxin"));
            HColumnDescriptor cf = new HColumnDescriptor("cf");
            cf.setMaxVersions(3);
            cf.setTimeToLive(1000);
            dianxin.addFamily(cf);
            admin.createTable(dianxin);
        }
    }

    //将数据写入hbase,以mdn作为rowkey,以起始时间作为写入hbase的时间戳
    @Test
    public void putAll() throws IOException{
        BufferedReader br = new BufferedReader(new FileReader("D:\\BigDaTa\\JAVA项目\\ShuJia01\\data\\part-00001"));
        String line = null;
        int batchSize=1000;
        ArrayList<Put> puts = new ArrayList<Put>();
        while ((line=br.readLine())!=null){
            String[] split = line.split(",");
            byte[] mdn = split[0].getBytes();
            Long start_time = Long.parseLong(split[1]);//以start_time作为每条数据的时间戳
            byte[] lg = split[4].getBytes();//经度
            byte[] lat = split[5].getBytes();//纬度
            Put put = new Put(mdn);
            put.addColumn("cf".getBytes(),"lg".getBytes(),start_time,lg);
            put.addColumn("cf".getBytes(),"lat".getBytes(),start_time,lat);
            puts.add(put);
            if (puts.size()==batchSize){
                dianxin.put(puts);
                puts= new ArrayList<Put>();
            }
        }
        if (puts.size()!=0){
            dianxin.put(puts);
        }
    }

    //根据用户的mdn获取用户最新的三个位置 使用get的方式获取
    @Test
    public void getPosition() throws Exception{
        String mdn = "47BE1E866CFC071DB19D5E1C056BE28AE24C16E7";
        Get get = new Get(mdn.getBytes());
        get.setMaxVersions(3);

        Result result = dianxin.get(get);
        //这样只能获取最新的一条数据
//        String lg = Bytes.toString(result.getValue("cf".getBytes(), "lg".getBytes()));
//        String lat = Bytes.toString(result.getValue("cf".getBytes(), "lat".getBytes()));
//        System.out.println(lg+","+lat);

        ArrayList<String> lglist = new ArrayList<String>();
        ArrayList<String> latlist = new ArrayList<String>();
        List<Cell> cells = result.listCells();
        for (Cell cell : cells) {
            String column = Bytes.toString(CellUtil.cloneQualifier(cell));//列名
            String value = Bytes.toString(CellUtil.cloneValue(cell));//列值
            if ("lg".equals(column)){
                lglist.add(value);
            }else if ("lat".equals(column)){
                latlist.add(value);
            }
        }

        //输出
        for (int i=0;i<3;i++){
            System.out.println(lglist.get(i)+","+latlist.get(i));
        }

    }

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

}

在getPosition()中给出了一个md5号码,得到了最新的三个位置
在这里插入图片描述
感谢阅读,我是啊帅和和,一位大数据专业大四学生,祝你快乐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊帅和和。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值